排序算法:简易桶排序、冒泡排序、快速排序
快速排序
前两篇博文讲到的算法都各有千秋,桶排序节省时间但是浪费空间的现象很严重,而冒泡排序内存占用少,但执行的时间效率低,本篇博文就介绍一下既节省空间执行效率也高的算法** 快速排序**。
假设我们要对“6 1 2 7 9 3 4 5 10 8”这10个数排序,首先我们需要先随便找一个数作为**基准数 **(基准数只是用来做参考的数)。比如先以6为基准数,然后从数列两端开始“探测”,从__右__往__左__找比基准数小的数,再从__左__往__右__找比基准数大的数,找到之后,交换两个数的位置。
首先设置两个哨兵i和j。
因为基准数在左边,所以就先从右边开始探测(如果先从左边开始的话,虽然第第一个基准数可以正确归位,但是接下的基准数归位就回出错),j开始探测(j–),当找到5时停止探测,然后i开始探测(i++),到找到7时停止,这时i和j都找到了符合条件的数,然后就将i和j找到的数位置交换,即
然后让哨兵继续探测,j到4的位置停下来,i开始探测,到9的位置停止,然后将9和4的位置交换。
i和j的值这时相等了,然后就将6与3的交换,这时第一个基准数6就归位了。
z再依次将基准数6左右两边的数归位,具体步骤如下图:
完整代码如下:
#include <stdio.h>
int a[101],n;
void quicksort(int left,int right){
int i,j; //哨兵i和j
int temp; //基准数
int t;
if(left > right)
return;
temp = a[left]; //将最左边的数设为基准数
i = left;
j = right;
while(i != j){
while(a[j]>=temp && i<j){
j--;
}
while(a[i]<=temp && i<j){
i++;
}
//哨兵没有相遇 就将比基准数大的数与基准数小的数交换位置
if(i<j){
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
//将基准数归位
a[left] = a[i];
a[i] = temp;
//继续处理基准数右边的数
quicksort(i+1,right);
//处理基准数左边的数
quicksort(left,i-1);
return;
}
int main()
{
int i;
scanf("%d",&n);
for(i = 1;i<=n;i++){
scanf("%d",&a[i]);
}
quicksort(1,n);
for(i = 1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}