哈希排序:
改进了得插入排序,将待排序的数组根据差量分成若干的的子数组,分别进行插入排序,最后一步当差量为1的时候也就是直接的插入排序了,只是这时数组的序列已经大概是有序的了。 关键是增量
代码如下:
//希尔排序 void shell(int unsort[],int dx, int lenght) { for(int i = 0; i < dx; i++) { //插入排序 for(int j = 1; i+j*dx < lenght; j++) { if(unsort[i+j*dx] < unsort[i+(j-1)*dx]) { int k = j; int flag = unsort[i+j*dx]; while(i+(k-1)*dx > 0 && flag < unsort[i+(k-1)*dx]) { unsort[i+k*dx] = unsort[i+(k-1)*dx]; k--; } unsort[i+k*dx] = flag; } } } } //这里增量的取值规则为上次增量的一半,第一次为lenght/2 void shell_sort(int unsort[], int lenght) { int len = lenght; int dx = lenght/2; int i = 1; while(dx >= 1) { shell(unsort, dx, lenght); dx = dx/2; cout<<"第"<<i<<"趟:"; for(int k = 0; k < lenght; k++) { cout<<unsort[k]<<" "; } cout<<endl; i++; } }
结果如下:
注意:
这个排序的方法增量的选取决定了排序的效率,一般选的是(n/2,n/4,n/8...)n为数组的长度,每次选取为上次差量值得一半
详细步骤: