它是插入排序的改进版,看比较:
//插入排序 void insert_sort(int *arr,int n) { //priot为了保存哨兵元素 int pviot = 0, j = 0; //第一个元素有序,因此从i=1开始 for (int i = 1; i < n; ++i) { pviot = arr[i]; j = i-1; //如果哨兵元素之前的元素比自己大,则不断移位 while(j >= 0 && arr[j] >= pviot) { my_swap(arr[j],arr[j+1]); --j; } //放置哨兵元素到适当位置 arr[j+1] = pviot; } }
悲剧啊,本来在下面代码着色表示二者区别,可是编辑器不行啊,只好全是黑白了!
//希尔排序 void shell_sort(int *arr,int n) { //priot为了保存哨兵元素 int pviot = 0, j = 0; //第一个元素有序,因此从i=1开始 for (int gap = n/2;gap>0;gap /= 2) { for (int i = gap; i < n; ++i) { pviot = arr[i]; j = i-gap; //如果哨兵元素之前的元素比自己大,则不断移位 while(j >= gap-1 && arr[j] >= pviot) { my_swap(arr[j],arr[j+gap]); j -= gap; } //放置哨兵元素到适当位置 arr[j+gap] = pviot; } } }
完成源码如下:
#include<iostream> //交换数据 inline void my_swap(int &a, int &b) { int temp = a; a = b; b =temp; } //希尔排序 void shell_sort(int *arr,int n) { //priot为了保存哨兵元素 int pviot = 0, j = 0; //第一个元素有序,因此从i=1开始 for (int gap = n/2;gap>0;gap /= 2) { for (int i = gap; i < n; ++i) { pviot = arr[i]; j = i-gap; //如果哨兵元素之前的元素比自己大,则不断移位 while(j >= gap-1 && arr[j] >= pviot) { my_swap(arr[j],arr[j+gap]); j -= gap; } //放置哨兵元素到适当位置 arr[j+gap] = pviot; } } } //打印数组 void dis_arr(int *a, int n) { std::cout << "The array is: "; for (int i = 0; i< n;++i) { std::cout << a[i] << " "; } std::cout << std::endl; } int main() { int arr[] = {-99999,96,1,-1,90,20,8,-80,100,896,-8855}; int n = sizeof(arr)/sizeof(*arr); dis_arr(arr,n); shell_sort(arr,n); dis_arr(arr,n); }
之前看网上的伪代码运行总出错,还是按自己的想法来好点,⊙﹏⊙b汗