插入排序和希爾排序(C語言)
- 插入排序
- 希爾排序
閱讀之前注意:
本文閱讀建議用時:20min
本文閱讀結構如下表:
項目 | 下屬項目 | 測試用例數量 |
---|---|---|
插入排序 | 無 | 1 |
希爾排序 | 無 | 1 |
插入排序
插入排序的關鍵在於:
- 當前元素前面的序列都是有序的,再把當前元素插入到這個有序序列中,於是形成多了一個元素的有序序列
- 再把這個有序序列後的元素看成當前元素,重複步驟1,直至有序序列後沒有元素,即完成了整個序列的排序
參考以下代碼:
#include<stdlib.h>
#include<stdio.h>
void insertSort(int *a,int n)//插入排序
{
int i = 0;
int j = 0;
int tmp = 0;
int time = 0;
for (i = 1; i < n; i++)
{
tmp = a[i];
for (j = i ; (j > 0 && tmp<a[j-1]); j--)
{
a[j] = a[j - 1];//a[j-1]元素後移
time++;
}
a[j] = tmp;
}
printf("move times:%d\n", time);
}
void main()
{
int a[10] = { 1, 5, 9, 7, 2, 3, 6, 8, 4, 0 };
insertSort(a, 10);
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
system("pause");
}
在代碼的insertSort()函數體中,我加入了一個time的變量來計數元素移動的次數。
希爾排序
希爾排序相對於插入排序而言,加入了數據分組的思想。這樣就使得相距較遠的元素也能很快的交換到對應的位置,而不必像插入排序一樣一個一個的往前交換,從而減少了交換的次數。
參考以下代碼:
#include<stdio.h>
#include<stdlib.h>
void shellSort(int *a,int size)//希爾排序
{
int gap = size;
int i = 0;
int j = 0;
int tmp = 0;
int time = 0;
do
{
gap = gap / 3 + 1;
for (i = gap; i < size; i++)//這裏即基礎的插入排序
{
tmp = a[i];
for (j = i; (j > 0) && (tmp < a[j - gap]); j -= gap)
{
a[j] = a[j - gap];
time++;
}
a[j] = tmp;
}
} while (gap > 1);
printf("move times:%d\n", time);
}
void main()
{
int a[10] = { 1, 5, 9, 7, 2, 3, 6, 8, 4, 0 };
shellSort(a, 10);
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
system("pause");
}
運行以上程序,可以看到希爾排序交換的次數更少,或者說其時間複雜度降下來了。1
如果本文對你有幫助,不如請我一罐可樂吧 🍼
程序基於王保明先生的講課內容. ↩︎