1.直接插入排序
思想:基於已排序好的有序表,從有序元素的下一個元素開始,從後向前掃描,如果已排序的元素大於新元素,則已排序元素後移一位,直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置後,重複循環至所有元素有序。
優點:穩定,迅速,只需用到O(1)的額外空間的排序。
缺點:比較次數不一定,數據量龐大時移動量大。
代碼實現:
void insert_sort(int* arr,int len)
{
if(arr == NULL || len < 0)
return ;
int j=0;
int tmp = 0;
for(int i=1;i<len;i++)
{
tmp = arr[i];//待插入元素
for(j=i-1;j>=0;--j)
{
if(arr[j] < tmp)
break;//若待查入元素大於有序元素,跳出
arr[j+1] = arr[j];//向後移動有序元素
}
arr[j+1] = tmp;//插入元素
}
}
2.希爾排序(縮小增量排序)
思想:確定一個增量序列(計算方法:n/2取整,其中n爲間隔元素數,首次計算n爲元素個數),將原始序列分割成間隔爲n的n個子序列,分別進行直接插入排序,然後重新計算n的值再進行排序,直到n=1時進行最後一次排序。
優點:快,移動元素少。
缺點:不穩定。
代碼實現:
Void ShellSort(int a[],int length)
{
int i,j;
int temp;
int increment=length; //初始化間隔值
do{
increment=increment/2;
for(i=increment;i<length;i++)
{
if(a[i]<a[i-increment])
{
temp=a[i];
for(j=i-increment;j>=0 && a[j]>temp;j-=increment)
{
a[j+increment]=a[j];
}
a[j+increment]=temp;
}
}
}
while(increment>1);
}
3.二者複雜度比較