• 高速排序(递归与分治的思想)


    快排具有递归和分治的思想。实现过程例如以下。

    第一步:对数组A中的第一个元素x运行操作,使得数组变成新的数组B,B中C段表示小于x的元素,D段表示大于x的元素

    第二步:把C段,D段,当成2个独立的数组,然后对这2个数组运行类似于第一步中A的操作

    第三步:这样B和D数组又相同被分成了三部分。依次类推重复运行相同的操作。


    代码:

    #include<iostream>
    using namespace std;
    void swap(int &a,int &b)
    {
    	int c;
    	c=a;
    	a=b;
    	b=c;
    }
    
    //返回切割点的位置i
    int split(int *A,int low,int high)
    {
    	int i,j,a;
    	i=low;
    	a=A[low];
    	for(j=low+1;j<=high;j++)
    	{
    		if(a>=A[j])
    		{
    			i++;
    			if(i!=j)
    			{
    				swap(A[i],A[j]);
    			}
    		}
    	}
    	swap(A[low],A[i]);
    	return i;
    }
    
    
    //使用分治的思想调用递归
    void quick_sort(int *A,int low,int high)
    {
    	if(low<high)
    	{
    		int mid;
    		mid=split(A,low,high);
    		quick_sort(A,low,mid-1);
    		quick_sort(A,mid+1,high);
    
    	}
    }
    
    void main()
    {
    	int a[4]={22,33,1,28};
    	quick_sort(a,0,3);
    	for(int i=0;i<4;i++)
    		cout<<a[i]<<endl;
    	system("pause");
    
    }
    


    关键算法split算法的步骤例如以下:

    第一步:先让i指向第一个元素9。j指向第2个元素3。假设j的元素比9小,j往前走一步,i也往前走一步

    第二步:假设j指向的数。比方图中的21比第一个元素9要大。那么i停住,j继续往前面走

    第三步:j一直走到找到一个元素,它的值比9小,此时j停住,i往前走一步,然后i与j所指向的值互换

    第四步:互换后假设j后没有元素。则停住。否则反复第1到第3步。

    第四步:把i的值与第一个元素9互相换



    高速排序时间复杂度分析:

    最坏情况下是。元素是依照递增或者递减排序好了的。此时操作的时间为O(n²)

    平均情况下是。O(nlogn)

    因此。它是不稳定的排序


  • 相关阅读:
    MongoDB导入数据库异常——Failed: cannot decode array into a D
    Unity中实现文字竖排的方法
    MongoDB基础
    基于Vuforia的Unity增强现实应用开发
    Windows设置自动关机
    开源软件的License科普
    87版《红楼梦》与原著回目对应表
    WCF初探-23:WCF中使用Message类(下)
    WCF初探-22:WCF中使用Message类(上)
    WCF初探-21:WCF终结点(endpoint)
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7008668.html
Copyright © 2020-2023  润新知