快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分关键字均比另一部分记录的关键字小,则可分别对记录继续进行排序,已达到整个序列有序的目的。
话不多说直接上例子,这样理解起来比较方便。
假设一组序列50,70,34,10,49,63,29要求对其进行排序,我们使得low指向第一个元素,high指向最后一个元素,令tmp=50;
从右向左,high位置的元素小于50,则将50和29互换,所得结果如下所示:
从左向右,low位置的29小于50则low++,此时low所指的位置70大于50,则将50和70互换,所得结果如下所示:
从右向左,high位置所指的元素70大于50,则high--,此时high指向63,并且63>50,high++,此时high指向49并且49<50,则将low所指向的位置50和49互换,所得结果如下所示:
从左向右,low位置所指元素为49<50,则low++,此时low指向10并且10<50,则low++,此时low=high,则结束循环。所得结果如下所示:
返回low的值将序列分为两个部分,29,49,34,10;63,70;再利用上述原理对其进行操作;最后将会得到有序序列
利用程序进行验证:
#include<stdio.h>
#include<stdlib.h>
void show(int *p,int length)//显示数组元素
{
int i;
printf("*********\n");
for(i=0;i<length;i++)
{
printf("%d,",p[i]);
}
printf("\n");
printf("*********\n");
}
void swap(int *a,int *b)//交换数据
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
int Partion(int a[],int low,int high)
{
int tmp=a[low];//每次都把序列的首元素作为基准进行比较
while(low<high){
while(low<high && a[high]>=tmp)//从右向左比较,若大于基准则high--,若小于基准元素循环停止
high--;
swap(&a[low],&a[high]);//找到小于基准的元素,将其与low位置的元素互换
while(low<high && a[low]<=tmp)//从左向右比较,若小于基准则low==,若大于基准元素循环停止
low++;
swap(&a[low],&a[high]);//找到大于基准的元素,将其与high位置的元素互换
}
return low;//返回后分成两个子序列,此值为划分点
}
void QuickSort(int a[],int low,int high)//
{
int n;
if(low<high){
n=Partion(a,low,high);
QuickSort(a,low,n-1);
QuickSort(a,n+1,high);
}
}
int main()
{
int a[7]={50,70,34,10,49,63,29};
show(a,7);
QuickSort(a,0,6);
show(a,7);
return 0;
}
本人认为其实理解快速排序算法最有效的方法是把步骤自己再抄稿纸上推导一遍。