1.快速排序是一种交换排序
2.基本思想:
选取一个基准数;
然后将大于和小于基准的元素分别放置于基准数两边;
继续分别对按此方法分治基准数的两侧,直至整个序列有序。
3. 注意问题
基准数的选择(通常选取头元素或者尾元素)
元素的查找(一组一组的查找需要交换的元素)
递归调用(终止递归的临界条件)
基准数的归位(查找相遇的位置和基准元素互换)
4. 元素查找的先后顺序(以升序为例):
如果基准数选取为array[low],那么必须先从高位high查找到小于基准的数,然后再从低位low寻找大于基准的数,交换;
如果基准数选取为array[high],那么必须先从低位low查找到大于基准的数,然后再从高位high寻找小于基准的数,交换;
原因:
当两侧查找相遇的时候,需要将基准数和相遇点元素的值交换以正确归位基准数;
也就是若基准数=array[low]的这种情况,相遇点的元素值必须小于基准值,
如果先从低位low查找大于基准的数,最终停止的元素大于基准值的话,就会导致归位失败。
5.代码:
int Partition(int array[], int low, int high){
int base = array[low];
while(low < high){
while(low < high && array[high] >= base){
high --;
}
swap(array,low,high);//array[low] = array[high];
while(low < high && array[low] <= base){
low ++;
}
swap(array,low,high);//array[high] = array[low];
}
array[low] = base;
return low;
}
void QuickSort(int array[], int low, int high){
if(low < high){
int base = Partition(array,low,high);
QuickSort(array,low,base - 1);
QuickSort(array, base + 1, high);
}
}
完整代码:
#include<stdio.h>
void Swap(int arr[], int low, int high)
{
int temp;
temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
int Partition(int arr[], int low, int high)
{
int base = arr[low];
while(low < high)
{
while(low < high && arr[high] >= base)
{
high --;
}
Swap(arr, low, high);
while(low < high && arr[low] <= base)
{
low ++;
}
Swap(arr, low, high);
}
return low;
}
void QuickSort(int arr[], int low, int high)
{
if(low < high)
{
int base = Partition(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]);
}
printf("\n");
QuickSort(arr, 0, n-1);
for(j = 0; j < n; j ++)
{
printf("%4d",arr[j]);
}
return 0;
}