模拟快速排序(C++版)

纯新人有啥错误的还望大佬指出

原理优化 (分治)

将原来的N方优化为N*log(N)

将逐一对比优化为分步

/////////////以从大到小举例

先确定分界点,将分界点的值命名为X

(因为必须要在左右端点以内,所以一般取两端点之和除以2)

然后以X为中心进行交换

(将左边第一个比A大的数值的坐标记录,将右边第一个比A小的记录,交换两者的值)

直到X的左边都比X大,X的右边都比X小,停止,向两边重复进行操作(这时以分界点为中心分为两部分,向左的部分右端点为j,向右部分左端点为j+1///可改变)(log(n)次)

最后便是答案

代码仅供参考

C++版本

#include <iostream>

using namespace std;

int n;
int q[10010];//数据范围待定
void sort_(int q[],int l,int r)//q为数组,l、i为左右端点
{
    if(l>=r) return;
    int i=l-1,j=r+1,x=q[(l+r)>>1];//(l+r)>>1是l+r除以2的意思
    while(i<j)
    {
        i++,j--;//与上文中i=l-1,j=r+1相接应,防止因为相同出现死循环
        while(q[i]<x) i++;//(求x左边第一个大于x的值)
        while(q[j]>x) j--;//(求x右边第一个小于x的值)
        if(i<j) swap(q[i],q[j]);//交换i,j,下标的值
    }
    sort_(q,l,j),sort_(q,j+1,r);
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    scanf("%d",&q[i]);
    sort_(q,0,n-1);
    for(int i=0;i<n;i++)
    cout<<q[i]<<' ';
    return 0;
}

 


 

posted @ 2021-08-29 16:26  喵喵不嗷唔  阅读(72)  评论(0)    收藏  举报