直接插入排序(穩定算法)的基本思想:從第一個數開始,認定數組的前i個數有序,依次遍歷數組,把後面的數據插入到合適的位置,使數組繼續保持有序。
#include <stdio.h>
void Swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//直接插入排序 升序
void InsertSort_Up(int* arr, int length)
{
int i;
//假定第0個元素是有序表,從第1個元素開始往有序表中插入數據
for (i = 1; i < length; i++)
{
int temp = arr[i];
int j;
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
{
arr[j + 1] = arr[j];//往前挪
}
arr[j + 1] = temp;
}
return;
}
//直接插入排序 降序
void InsertSort_Down(int* arr, int length)
{
int i;
//假定第0個元素是有序表,從第1個元素開始往有序表中插入數據
for (i = 1; i < length; i++)
{
int temp = arr[i];
int j;
for (j = i - 1; j >= 0 && arr[j] < temp; j--)
{
arr[j + 1] = arr[j];//往前挪
}
arr[j + 1] = temp;
}
return;
}
void PrintArr(int* arr, int length)
{
int i;
for ( i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return;
}
int main( )
{
int a[] = {3, 5, 2, 1, 9, 0, 6, 4, 7, 8};
int length = sizeof(a) / sizeof(a[0]);
InsertSort_Up(a, length);
PrintArr(a, length);
InsertSort_Down(a, length);
PrintArr(a, length);
return 0;
}
時間複雜度:最佳情況O(n),最壞情況O(n^2),平均時間複雜度O(n^2)。
空間複雜度:需要一個臨時變量temp來存儲即將插入的數據所以O(1)。