几种常用的排序方法7--希尔排序
希尔排序
希尔排序又称为缩小增量排序,它是直接插入排序的一种改进,它的基本思想是:将整个待排记录序列分割成若干个子序列,然后分别对子序列进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行直接插入排序。
上面是数据结构数上话,看起来很绕人,其实很简单,就是一种插入排序,只是如何选取子数列:跳跃选取,每隔一个增量k选取一个数,这些数构成一个子序列(相当于数学中的同余)。一般来说每进行一次shell排序,k的值变为一半,直到为1。
1 void shell_sort(int * A, int n) 2 { 3 int i, j; 4 int temp; //存放数据的变量 5 int k = n/2; //初始选取的增量为长度的一半 6 while(k > 0) 7 { 8 for(i = k; i < n; i++) 9 { 10 temp = A[i]; 11 j = i - k; 12 while(j >= 0 && temp < A[j]) 13 { 14 A[j + k] = A[j]; //将较大的数放在后面 15 j = j - k; 16 } 17 A[j + k] = temp; //完成小数与大数的互换 18 } 19 k /= 2; // 选取的增量每次取一半,直到为1 20 } 21 }