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


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

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

    因此。它是不稳定的排序


  • 相关阅读:
    如何将程序集(dll)安装到全局程序集缓存(GAC)中
    当 ftp 遇上 http Proxy
    sql server 2008 帶主鍵table 字段 數據類型修改
    SQL 按指定顺序进行排序
    当发布时报错: 找不到 obj\Debug\Package\PackageTmp\xxx.aspx 文件
    c# 简体 繁体 转换
    SQL SERVER 简体与繁体 定序 轉換
    匿名类型与Lambda表达式
    使用委托实现了在循环中调用不同的方法
    学习源代码的心得
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7008668.html
Copyright © 2020-2023  润新知