分析來自原文
此處爲自我理解
1. 挖坑填數
i =Left; j = Right; 將基準數X挖出形成第一個坑a[i]。
while(i!=j)//直到i等於j
{
2.j–由後向前找比它(x)小的數,找到後挖出此數填前一個坑a[i]中。//多一個坑後面填
3.i++由前向後找比它(x)大的數,找到後也挖出此數填到前一個坑a[j]中。
}
將基準數X填入a[i]中
返回此時的i //或者j,i==j
int adjustarray(int s[],int left,int right)
{
int i=left,j=right,x=s[1];//存第一位的值。so begin from right
while(i<j)
{//left exchange
while(i<j&&s[j]>x)
j--;//
if(i<j)
{
s[i]=s[j];
i++;
}
//right exchange
while(i<j&&s[i]<x)
i++;
if(i<j)
{
s[j]=s[i];
j--;
}
s[i]=x;
}
}
2.分治法
- 先將數組進行一次排序(利用上個函數)
- 遞歸調用 (注意left與right的值的變化)左右分開。
void quick_sort(int s[],int left,int right)
{
if(left<right)
{
int i=adjustarray(s,left, right);
quick_sort( s,left,i-1);
quick_sort( s,i+1,right);
}
}
1+2=3.整合
void quick_sort(int s[],int left,int right)//right爲下標
{
int i=left,j=right,x=s[i];
if(i<j)
{
while(i<j)
{
while(i<j&&s[j]>x)
j--;
if(i<j)
s[i]=s[j];
while(i<j&&s[i]<x)
i++;
if(i<j)
s[j]=s[i];
} //此處可不用,循環到前面可+1
}
s[i]=x;
quick_sort(s,left,i-1);
quick_sort(s,i+1,right);
}
//可能有點問題???
//選擇基準可以跟簡潔!三值選中
//別人的代碼,
int Partition(int A[], int left, int right){
int p = round(1.0*rand()/RAND_MAX*(right - left) + left);
swap(A[p], A[left]);
int temp = A[left];
while(left < right> temp) right--;
A[left] = A[right];
while(left < right && A[left] <= temp) left++;
A[right] = A[left];
}
A[left] = temp;
return left;
}
void quickSort(int A[], int left , int right){
if (left < right){
int pos = Partition(A, left, right);
quickSort(A, left, pos -1);
quickSort(A, pos + 1, right);
}
}
int main(){
int A[5] ={2, 4, 1, 3, 5};
quickSort(A, 0, 4);
for (int i = 0; i < 5; ++i) {
if(i) printf(" ");
printf("%d", A[i]);
}
return 0;
}