zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序的算法是通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两个子序列应用这个方法进行排序。

    先总结一下写快速排序的过程中发生错误:

    错误一:递归中还用了while,导致这个递归不能停止。

    错误二:元素的大小逻辑关系搞错了。

    快速排序算法首先需要将获得一次划分获得的位置,并以此位置来递归的处理左侧子序列和右侧子序列。

    /*
    一次划分算法:
    1、选第一个元素为基准元素。
    2、从后向前搜索第一个比基准元素小的,交换到基准元素所在位置。
    3、从前向后搜索第一个比基准元素大的,交换上述空缺的位置。
    4、将基准元素赋值到该有的位置,返回该基准元素。
    */

    int Partion(int *arr,int start,int end)
    {
    	int baseq=arr[start];
    
    	while(start<end)
    	{
    		while(start<end && arr[end]>=baseq)
    			--end;	//自减1
    		
    		arr[start]=arr[end];	//找到,赋值
    		while(start<end && arr[start]<=baseq)	//错误二:<=号
    			++start;//自增1
    		
    		arr[end]=arr[start];	//找到,赋值
    
    	}
    	
    	arr[start]=baseq;
    	return start;	//返回一次划分基准元素的位置
    }
    

    /*
    快速排序算法:
    1、如果子序列的长度不为0,则进行递归操作。
    2、获得一次划分的基准元素位置。
    3、分别递归处理左侧子序列和右侧子序列。
    */

    void QSortArl(int *arr,int start,int end)
    {
    	//错误一:递归里面不能再写while for等循环
    	if(start<end)
    	{
    		int pos=Partion(arr,start,end);
    		QSortArl(arr,start,pos-1);	//递归处理左子序列
    		QSortArl(arr,pos+1,end);	//递归处理右子序列
    	}
    }
    

    测试结果如下:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	int qarr[7]={49,38,65,97,76,13,27};
    	int *q=qarr;
    	int Partion(int *q,int start,int end);
    	void QSortArl(int *q,int start,int end);
    
    	QSortArl(q,0,6);	//错误三:这里的end为6
    	for(int i=0;i<7;i++)
    		cout<<qarr[i]<<" ";
    	cout<<endl;
    	return 0;
    }
    

    13 27 38 49 65 76 97
    请按任意键继续. . . 

  • 相关阅读:
    python装饰器的作用
    python的__call__、__str__、__repr__、__init__、__class__、__name___、__all__、__doc__、__del__等魔术方法的作用
    安全小测试:介绍一个简单web安全知识测试的网站
    浏览器都知道我们的哪些信息?
    SQL开发技巧(二)
    如何解决SQLServer占CPU100%
    记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
    如何在SQLServer中处理每天四亿三千万记录
    SqlServer索引的原理与应用
    T-sql语句查询执行顺序
  • 原文地址:https://www.cnblogs.com/fistao/p/3075853.html
Copyright © 2011-2022 走看看