c語言——直接插入排序
插入排序就是將一個記錄插入到已排好序的序列中,從而得到一個新的有序序列。
哪裏有一個排好序的序列
那問題是我們要排序的是一個數組,哪裏來一個排好序的序列呢?這時,我們可以把數組下標爲0的元素想像成一個有序的數組,這個數組內只有他一個元素,所以,它總是有序的。後面的元素和他比較。
以升序爲例
升序
//升序
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp < arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
運行,
4 2 8 0 5 7 1 3 9
0 1 2 3 4 5 7 8 9
降序
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp > arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
運行
4 2 8 0 5 7 1 3 9
9 8 7 5 4 3 2 1 0
完整代碼
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void printArray(int arr[],int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp > arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
void test()
{
int arr[] = { 5, 3, 9, 2, 1, 3 };
int len = sizeof(arr) / sizeof(int);
printArray(arr, len);
InsertSort(arr, len);
printArray(arr, len);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
時間複雜度
空間複雜度
直接插入排序中只使用了i,j,tmp這三個輔助元素,與問題規模無關,空間複雜度爲。
是否是穩定排序
相同元素的相對位置不變,如果兩個元素相同,插入元素放在相同元素後面。是一種穩定排序。