希尔排序学习
它是插入排序的改进版,看比较:
//插入排序
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汗

浙公网安备 33010602011771号