#include<iostream>
using namespace std;
/*
* @author 饶奇奇
*@time 2022/4/22
* 使用软件 vim
* 算法思路:
* 所谓基准数归位就是让它的右边全部大于它,它的左边全部小于它
* 1.以第一个数为基准数
* 2.从右开始扫描遇到比基准数小的数停住,把这个值赋给左指针指向的位置
* 3.从左指针下一个数开始扫描遇到比基准数大的数然后停住然后给上一个右指针的位置,并且向左移动右指针
* 4.如果左指针和右指针碰撞到了一起说名上一次左指针或者右指针其中有一个值和这个碰撞位置的值一样,而这个碰撞位置的值就是基准数归位的值
* 5.把碰撞位置的基准值归位
* 6.然后把基本左边进行快排,把右边进行快排
*
*容易错误:
* 每一次确定一个大于或者小于基准数的指针位置时候
* 要进行判断不能让左右两个指针碰撞不然归位时候就会把要归位基准数插入到下一个位置
*
*
*
*
*
*
*/
//快速排序
void quicksort(int** arr,int start,int end)
{
if(start>end)return;
//cout<<"递归"<<endl;
//默认采用第一个数为归为数
int i=start,j=end;
int gws=(*arr)[start];
//容器存在长度才进行快排
//cout<<"i--"<<i<<"j---"<<j<<"gws--"<<gws<<endl;
//cout<<endl<<endl;
//每一趟确定一个归位数
while(start<end)
{
//从右边开始搜索
//查找比归为数要小的数
while((*arr)[end]>=gws&&end>start)end--;
/*让上一次的start指针所指向的位置一定是比归为数
*/
/*
加上这个if的作用是避免当end==start的时候start海象后面移导致后面的基准归位出错
*/
if(end>start)(*arr)[start++]=(*arr)[end];
//查找比归位数大的数
while((*arr)[start]<gws&&start<end)start++;
if(end>start)(*arr)[end--]=(*arr)[start];
//cout<<"start--"<<start<<"end--"<<end<<endl;
}
//start指针和end指针碰撞的位置就是归位数最终指向的位置
(*arr)[start]=gws;
//对左边进行快排
quicksort(arr,i,start-1);
quicksort(arr,start+1,j);
//对右边进行快排
}
int main()
{
int s[] = {7,22,94,13,2,1,85};
int *b =s;
quicksort(&b,0,6);
for(int i=0;i<7;i++){
cout<<b[i]<<endl;
}
return 0;
}
快速排序c++版
最新推荐文章于 2024-06-16 22:47:03 发布