快速排序(Quicksort) 是对冒泡排序的改进,常简称为快排。
基本思想:
(1) 首先从待排序列中选定一个关键字,称之为 “枢轴”。
(2) 将待排序序列划分成位于枢轴前后的两个子序列:
a. 枢轴之前的子序列的所有关键字都不大于枢轴;
b. 枢轴之后的子序列的所有关键字都不小于枢轴;
此时枢轴已到位,如下图所示:
再按同样方法对左右两个子序列分别 “递归” 进行快速排序,最终使得整个序列有序。
C语言实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int partition(int arr[], int low, int high);//对序列进行划分,返回中枢值
void qsort(int arr[], int start,int end);//递归调用划分函数
void quicksort(int arr[],int len);//快速排序算法接口
void shuffle(int arr[],int len);//洗牌算法,随机打乱数组,使其分布为平均情况
void Print(int arr[],int len);//打印数组
int main()
{
int arr[] = {1,5,9,4,3,7,92,49,789,45,13,897};
int len = sizeof(arr)/sizeof(arr[0]);
Print(arr,len);
//打乱数组
shuffle(arr,len);
Print(arr,len);
//快速排序
quicksort(arr,len);
Print(arr,len);
return 0;
}
int partition(int arr[], int low, int high)
{
// 对数组[low..high] 作一次划分,并返回枢轴记录应该所处的位置
int base;
base = arr[low]; // 提取枢轴 作为比较对象
while (low < high)
{ // low和high从两端交替地向中间移动
while (low < high && arr[high] >= base) high--;
arr[low] = arr[high]; // 将比枢轴小的记录移到前端
while (low < high && arr[low] <= base) low++;
arr[high] = arr[low]; // 将比枢轴大的记录移到后端
}
//循环结束后low=high 该位置即为枢轴的位置
arr[low] = base;
//返回枢轴
return low;
}
void qsort(int arr[], int start, int end)
{
//序列小于1结束递归
if(start < end)
{ //将序列分为左右两部分
int middle = partition(arr,start,end);
//左序列进行递归划分
qsort(arr,start,middle-1);
//右序列进行递归划分
qsort(arr,middle+1,end);
}
}
void quicksort(int arr[],int len)
{
qsort(arr,0,len-1);
}
void Print(int arr[],int len)
{
for (int i = 0; i < len; i++)
printf("%d ",arr[i]);
printf("\n");
}
void shuffle(int arr[],int len)
{
int randomInt;
srand((unsigned)time(NULL));
int temp;
for(int i = 0; i< len; i++)
{
randomInt = (rand()%(len-i)+i);
temp = arr[i];
arr[i] = arr[randomInt];
arr[randomInt] = temp;
}
}