zoukankan      html  css  js  c++  java
  • 希尔排序学习

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

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

  • 相关阅读:
    gdb调试动态链接so
    set non-stop on
    ntp对时
    360se打开慢,lsass 过高 , cpu温度上升
    CiscoIOUKeygen
    jitwatch查看JIT后的汇编码
    直接打开virtualbox报错
    老码农的Java干货资源
    java C 类自动转换规则
    java static learning
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2147350.html
Copyright © 2011-2022 走看看