zoukankan      html  css  js  c++  java
  • 高速排序(递归与分治的思想)

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

    第一步:对数组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)

    因此。它是不稳定的排序


  • 相关阅读:
    面向对象优势
    二维码
    数据库分页
    DBUtil连接数据库
    sqliteDOC创建数据库
    ajax的回调函数
    多线程
    JSTL优点
    WebSocket 搭建简单聊天网站
    全等和不全等
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7008668.html
Copyright © 2011-2022 走看看