#include "stdio.h"void q_sort(int a[],int l,int r);void swap(int& a,int& b);int partition1(int a[],int l,int r);int partition2(int a[],int l,int r);int main(){int a[]={1,5,2,4,1,5,3,6,8,0,5,3,7,8,0};q_sort(a,0,14);for(int i=0;i<14;i++)printf("%d ",a[i]);return 0;}void q_sort(int a[],int l,int r){//如果l<r,執行下面操作if(l<r){//選擇分區點,使左邊的值都小於分區點,右邊的值都大於分區點int s=partition1(a,l,r);q_sort(a,l,s-1); //對前部分繼續排序 q_sort(a,s+1,r); //對後部分繼續排序}}void swap(int& a,int& b){int temp=a;a=b;b=temp;}/* 1.選擇第一個元素做分區點,定義兩個指標,i從第一個元素開始遍曆,k從最二個元素開始遍曆2.if (a[k]<x),則兩個指標同步前移,否則k前移,i保持不動,待k找到一個比區點小的值(這個值應移至前面)之後3.比較i,k是否相同,如果不同,則說明i,k之間隔了比區點大的值,需要將a[k](大值)和a[i](小值)的下一個數交換,k遍曆完整個數組後,再將第一個元素與a[i]交換完成一輪劃分舉例:5,1,2,3,6,7,0,8開始i指向5,k指向1,for 2 to r,比較a[k]與5的大小,在1,2,3過程,i,k同步前移,6,7,3,k會停在0處,而i停在3處,++i,再交換a[i],a[k],則小值移至前面,大值移至後面。*/int partition1(int a[],int l,int r){int i=l;int x=a[i];for(int k=l+1;k<=r;k++) {if (a[k]<x){i++;if (i<k)swap(a[i],a[k]);}}swap(a[l],a[i]);return i;}int partition2(int a[],int l,int r){// 定義兩個指標,一個從後往前k,一個從前往後遍曆iint i=l;int k=r;//將第一個值賦給x,可想象成將a[i]挖空,然後用x暫存a[i]int x=a[i];// 如果i<k,繼續while (i<k) {// 從後往前找小(大的直接越過k--)while(i<k && a[k]>x)k--;// 如果i<k,說明找到了小值a[k],於是將a[k]放到被挖空的位置上,並且i++,此時可想象成a[k]的值放到了a[i]上,而a[k]的位置被挖空if(i<k) a[i++]=a[k];// 從前往後找大while(i<k && a[i]<x)i++;// 如果找到將大值賦給右邊被挖空的位置if(i<k) a[k--]=a[i];}// 最後必然有i==k,將一開始的x值賦給a[i],最後一個空位,則一次劃分完成a[i]=x;return i;}