本文主要是叙述一次快速排序算法中发生了哪些步骤,以加深对快速排序算法的理解。
算法原理:
通过一个参照数把整个数列分为大于它的部分和小于它的部分,再分别处理其两边的数列,直到结束。
算法步骤:
1.首先从需要排序的数列中选取一个参照点,如第一个数据,即key=a[low]。
2.从数列最后一位开始与key进行比对(降序排列),如果小于key则比对下一个,即high--(为了把比key大的挑出来)并把a[high]赋值给a[low](相当于high位空出来);
高位交换完成后同样从低位找出比key小的,然后赋值。循环执行直到high=low。这个时候把key赋值给a[low](因为high第一次赋值把low位给占了)。
3这样一次while排序结束时low=high,以low为分界,左边的全部都不小于a[low],右边都不大于a[low]。
4.传出此时low的值为pivotloc ,把数组以pivotloc为分界化成两段(即a[low - (pivotloc-1)] 和 a[pivotloc+1 - high])。
5.把剩下分为两段的数组再执行1-4的操作,递归执行。(注意递归操作时判断语句要用if,不能用while。不然导致死循环)。
当关键数为最大或最小值时发生了什么:
如降序排列时,有如下数组:10,2,5,8,9,4,1,7 。关键数为10,那么右边所有的数都比它小。high-- 一直执行 ,直到high=low=0。本次排序函数没有对数列做出变换,但是确定了low右边所有的数都不大于它,接下来只需要对a[1-7]进行排序。因此把数组分为a[low - (pivotloc-1)] 和 a[pivotloc+1 - high]两段是必须的。
代码部分:
#include<stdio.h>
int partition(int *a,int low,int high);
int Qsort(int *a,int low,int high);
int main()
{
int i,a[10]={10,2,9,10,5,7,6,8,3,10};
Qsort(a,0,9);
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
int partition(int *a,int low,int high) //排序一次
{
int i,key,temp;
key=a[low];
while(low<high)
{
while(low<high && a[high]<=key) high--; //升序、降序的关键
a[low]=a[high];
while(low<high && a[low]>=key) low++;
a[high]=a[low]
}
a[low]=key;
return low;
}
int Qsort(int *a,int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=partition(a,low,high);
Qsort(a,low,pivotloc-1);
Qsort(a,pivotloc+1,high);
}
return 0;
}