希尔排序学习

它是插入排序的改进版,看比较:

//插入排序
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汗

原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2147350.html