insertion sort理解比较简单,所以就直接看code:
void insertionSort(int a[], int n)
{
int i, j, key, temp;
// 初始时,第一个element是sorted
// 引入key,作为一个变动的index
for(i = 1; i < n; i++){
key = i;
j = key - 1;
// 当a[j] > a[key]的时候,就swap
// key和j同时递减
while(j >= 0 && a[j] > a[key]){
temp = a[key];
a[key] = a[j];
a[j] = temp;
key--;
j--;
}
}
}
// 上面的code,可写成两个for loop,更简洁一点
void insertionSort(int a[], int n)
{
int i, j, key, temp;
for(i = 1; i < n; i++)
for(key = i, j = key - 1; j >= 0 && a[j] > a[key]; key--, j--){
temp = a[key];
a[key] = a[j];
a[j] = temp;
}
}
shell sort对insertion sort做了优化,但shell sort的运行理解起来会相对更难一点。shell sort总的思路是快速地减少乱序,把一个大的数组分割成多个小的数组,各个小的数组分别执行insertion sort。举一个具体的例子:
数组:7 6 5 4 3 2 1
1)先按照3的间距(gap),数组被分成三个子数组:(7, 4, 1)、(6, 3)、(5, 2)。
2)三个子数组,进行insertion sort。以(7, 4, 1)为例,(7, 4, 1) -> (4, 7, 1) -> (1, 4, 7)。
shell sort的C语言代码如下:
void shellsort(int v[], int n)
{
int gap, i, j, temp;
for(gap = n/2; gap > 0; gap /= 2)
for(i = gap; i < n; i++)
for(j = i - gap; j >= 0 && v[j] > v[j+gap]; j-= gap)
{
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
}
}
可以看到insertion sort和shell sort的代码非常相似。