快速排序
快速排序的算法是通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两个子序列应用这个方法进行排序。
先总结一下写快速排序的过程中发生错误:
错误一:递归中还用了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
请按任意键继续. . .