快排

思想:每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
基于二分思想的算法。

测试用例:

10

8 6 2 4 1 9 7 5 10 3

 

 

#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h> 
#include <algorithm>
using namespace std;

int n,m;
int ans=99999999,num=0;
bool vis[105];
int dp[105][105],aa[105];
void quicksort(int left,int right){
    int i,j,t,temp;
    if(left>right){
        return;
    }
    temp=aa[left];               //每一趟的基数 
    i=left;
    j=right;
    while(i!=j){
        while(aa[j]>=temp&&i<j) 
            j--;                                    // j 从右向左移  i从 左向右移  默认右边大 左边小 
        while(aa[i]<=temp&&i<j) 
            i++;                                    // i<j 避免移动过了 
        if(i<j){
            t=aa[i];aa[i]=aa[j];aa[j]=t;
        } 
    } 
    aa[left]=aa[i];                                 //此次 i=j 即是中间那个数
    aa[i]=temp;                                     //基数归位
    
    quicksort(left,i-1);                            //递归处理基数左边的部分 
    quicksort(i+1,right);                           //递归处理基数右边的部分 
}
int main() {
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>aa[i];
    } 
    quicksort(0,n-1); 
    for(int i=0;i<n;i++){
        cout<<aa[i]<<" ";
    } 
    return 0;
}

 

posted @ 2020-03-23 18:30  Maxwell·  阅读(172)  评论(0编辑  收藏  举报