分析来自原文
此处为自我理解
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;
}