开始学数据结构——(六):希尔排序

来源:互联网 发布:超级淘宝系统悟有所得 编辑:程序博客网 时间:2024/06/09 14:49

好久没有写关于数据结构的笔记了,快校招了,得补补,面试或许有用的。

下面讲希尔排序,作为简单插入排序的改进:

先讲下思路: 挺简单的。 简单插入排序,就是后面的数来的从后面开始比较,只要<前面的数,就将前面的数往后移动一位,直到不能移动为止,则是要插入的地方。

****为何出了希尔排序呢,上面的思路挺容易忽略一个简单的事实,那就是我们都是从后面的数和前面的一个数开始比较,这里步长是1.  如果不长不是1 呢。那就是我们的希尔排序,希尔排序就是假定一个步长,然后调用简单插入排序,然后这个步长慢慢减小,直到为1. 那么就OK了。  ******


#include<stdio.h>#include<unistd.h>void print(int a[], int n ){  int j;    for(j= 0; j<n; j++)          printf("%d",a[j]);     printf("\n");      }  /**  * 直接插入排序的一般形式  *  * @param int dk 缩小增量,如果是直接插入排序,dk=1  *  */    void ShellInsertSort(int a[], int n, int dk)  {  int i ,j ,x;    for(i= dk; i<n; ++i){           if(a[i] < a[i-dk]){  //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入               j = i-dk;     //后面的数小于前面的数,那么就递归交换这两个数的位置,而前面的数的位置是 i-dk             x = a[i];       //x就是后面的数,但是不一定就是放在 i-dk的位置上,还需要比较,所以暂时保存下来            a[i] = a[i-dk];    //但是后面的数却可以立即的保存下来而不需要再次比较了。             while(x < a[j-dk] && ((j-dk)>=0) ){ //查找在有序表的插入位置   如果比以前的数还小,那么就一直的递归比较。                a[j] = a[j-dk];                  j -= dk;             //元素后移              }              a[j] = x;            //插入到正确位置      } }          print(a, n);  } /**  * 先按增量d(n/2,n为要排序数的个数进行希尔排序  *  */  void shellSort(int a[], int n){        int dk = n/2;      while( dk >= 1  ){          ShellInsertSort(a, n, dk);         dk = dk/2;      }  }  int main(){      int a[] = {3,1,5,7,2,4,9,6,1,2,3,6,5,4,7,8,9,6,3,2,1,0,0,0,0,98,96,97,100};      //ShellInsertSort(a,8,1); //直接插入排序      shellSort(a,sizeof(a)/sizeof(a[0]) );           //希尔插入排序      return 0;}

0 0