选取最左端(low)为基准值,以升序为例:
-
从右向左(high-low)查找到一个小于基准值的元素,再从左向右查找一个大于基准值的元素,再将两者相交换。
while(arr[j]>=temp&&low<high) high–;
while(arr[i]<=temp&&low<high) low++;
swap(arr , low , high); -
从右向左(high-low)查找到一个小于基准值的元素,将两者相交换,再从左向右查找一个大于基准值的元素,再将两者相交换。
while(arr[j]>=temp&&low<high) high–;
swap(arr , low , high);
while(arr[i]<=temp&&low<high) low++;
swap(arr , low , high);
注意: 选取不同的思路相应的函数结构以及返回值等细节代码会有细微的差异,且大部分情况下第二种思路的交换次数要比第一种多。
下面给出二者的完整代码:
#include<stdio.h>
void quickSort(int arr[],int low,int high)
{
if(low > high) return;
int left , right , base , temp;
base = arr[low];
left = low;
right=high;
while(left != right)
{
/*添加适当打印代码以观察和理解排序详细过程*/
/*for(int i=0 ; i<6 ;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
*/
while(arr[right]>=base && left<right) right--;
while(arr[left]<=base && left<right) left++;
/*printf("%d,%d\n",left,right);*/
if(left<right)
{
temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
}
}
arr[low]=arr[left];
arr[left]=base;
quickSort(arr,low,left-1);
quickSort(arr,left+1,high);
return;
}
int main()
{
int n;
scanf("%d ",&n);
int arr[n];
for(int i=0 ; i<n ;i++)
{
scanf("%d",&arr[i]);
}
quickSort(arr,0,n-1);
for(int i=0 ; i<n ;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
#include<stdio.h>
void Swap(int arr[], int low, int high)
{
int temp;
temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
/*定位交换元素位置,并返回下一趟排序的最左端元素位置(即基准元素位置)*/
int Location(int arr[], int low, int high)
{
int base = arr[low];
while(low < high)
{
while(low < high && arr[high] >= base)
{
high --;
}
Swap(arr, low, high);
/*printf("%d,%d\n",low,high);*/
/*for(int i=0 ; i<6 ;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
*/
while(low < high && arr[low] <= base)
{
low ++;
}
Swap(arr, low, high);
/* printf("%d,%d\n",low,high);*/
/*for(int i=0 ; i<6 ;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
*/
}
/*printf("%d ,%d\n",low,arr[low]);*/
return low;
}
void quickSort(int arr[], int low, int high)
{
if(low < high)
{
int base =Location(arr, low, high);
quickSort(arr, low, base - 1);
quickSort(arr, base + 1, high);
}
}
int main()
{
int n;
scanf("%d\n",&n);
int arr[n];
int i , j;
for(i = 0; i < n; i ++)
{
scanf("%d",&arr[i]);
}
quickSort(arr, 0, n-1);
for(j = 0; j < n; j ++)
{
printf("%d ",arr[j]);
}
return 0;
}