思想:每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
基于二分思想的算法。
测试用例:
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; }