“快速排序法”使用的是递归原理,下面我结合一个例子来说明“快速排序法”的原理。首先给出一个数组{53,12,98,63,18,72,80,46, 32,21},先找到第一个数--53,把它作为中间值,也就是说,要把53放在一个位置,使得它左边的值比它小,右边的值比它大。{21,12,32, 46,18,53,80,72,63,98},这样一个数组的排序就变成了两个小数组的排序--53左边的数组和53右边的数组,而这两个数组继续用同样的方式继续下去,一直到顺序完全正确。
一般来说,冒泡法是程序员最先接触的排序方法,它的优点是原理简单,编程实现容易,但它的缺点就是--程序的大忌--速度太慢。
附上快速排序代码:
#include
void quicksort(int a[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)
{
while(a[j]>=temp&&j>i)
j--;
if(j>i)
a[i++]=a[j];
while(a[i]<=temp&&j>i)
i++;
if(j>i)
a[j--]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
void main()
{
int a[]={53,12,98,63,18,72,80,46,32,21};
int i;
quicksort(a,0,9);
/*排好序的结果*/
for(i=0;i<10;i++)
printf("%4d\n",a[i]);
}
49 38 65 97 76 13 27 50 按非降序排,
用快速排序实现
解释:用每次取的数据作为分界点,在这之内分成2块
先和最后面的数据比较,当大于时就互换位置,在和前面的数据比较
设置low 和high个指针先与high(也就是最后一个关键字比较)大于就互换位置否则就不换指导换了一次位置后改变high的位置,在与low比较小于就互换直到交换就重置low,在high就这样循环,直到high=low的时候就完成了一次
再在分开的2个区内用同样的方法比较
例如:
先去49 把数据分成 27 38 13 49 76 97 65 50
在取27 ,用相同的方法把 27 38 13排
取76 把76 97 65 50排
取49 先和50比较 小于50 在和27比较,大于27就互换位置
27 38 65 97 76 13 49 50
继续拿49 先和38比较大于就不换 在和65 小于就换位置
27 38 49 97 76 13 65 50
在拿49与13比较,大于就换
27 38 13 97 76 49 65 50
再拿65与97 小于换
27 38 13 49 76 97 65 60
再拿49与76比较,小于不换
一趟后: 27 38 13 49 76 97 65 60
继续;
蛋疼,擦,太难的表达出来了
49 38 65 97 76 13 27 50 按非降序排,
用快速排序实现
解释:用每次取的数据作为分界点,在这之内分成2块
先和最后面的数据比较,当大于时就互换位置,在和前面的数据比较
设置low 和high个指针先与high(也就是最后一个关键字比较)大于就互换位置否则就不换指导换了一次位置后改变high的位置,在与low比较小于就互换直到交换就重置low,在high就这样循环,直到high=low的时候就完成了一次
再在分开的2个区内用同样的方法比较
例如:
先去49 把数据分成 27 38 13 49 76 97 65 50
在取27 ,用相同的方法把 27 38 13排
取76 把76 97 65 50排
取49 先和50比较 小于50 在和27比较,大于27就互换位置
27 38 65 97 76 13 49 50
继续拿49 先和38比较大于就不换 在和65 小于就换位置
27 38 49 97 76 13 65 50
在拿49与13比较,大于就换
27 38 13 97 76 49 65 50
再拿65与97 小于换
27 38 13 49 76 97 65 60
再拿49与76比较,小于不换
一趟后: 27 38 13 49 76 97 65 60
继续; \