快速排序算法
quickSort简介:
快速排序算法(有时也成为划分-交换排序)是一种高效的排序算法,在情况较好的情况下,快速排序大概是归并排序或者堆排序的效率的二到三倍。
快速排序的是Tony Hoare 于1959年发明的,直到今日快速排序仍然是我们经常使用的排序算法之一。在平均情况下快速排序的时间复杂度是O(nlogn)
在最坏的情况下是O(n平方)。
详细内容:
查看更详细的内容(历史,推导),请访问维基百度。看了不少博客的内容,感觉还是wiki上讲的好。这里推荐给大家:
https://en.wikipedia.org/wiki/Quicksort
C/C++实现:
<span style="font-size:14px;">#include<stdio.h>
//函数声明
int Partition(int a[],int s,int e);
void quickSort(int a[],int s,int e);
void Swap(int &a,int &b);
/*
*快速排序函数
*参数一:待排序的数组
*参数二:数组的开始下标
*参数三:数组的结束下标
*/
void quickSort(int a[],int s,int e){
if(s<e)
{
int div = Partition(a,s,e);
quickSort(a,s,div-1);//对左侧部分进行递归
quickSort(a,div+1,e);//对右侧部分进行递归
}
}
/*
*分割函数
*参数一:待分割的数组
*参数二:数组的开始下标
*参数三:数组的结束下标
*/
int Partition(int a[],int s,int e)
{
int i = s,j = e+1;
int x = a[s];//以第一个值为参考值来划分
while(true)
{
while(a[++i]<x&&i<e);
while(a[--j]>x);
if(i>=j)
break;
Swap(a[i],a[j]);//交换位置
}
a[s] = a[j];
a[j] = x;
return j;
}
/*
*交换元素位置函数
*参数一:交换的第一个元素
*参数二:交换的第二个元素
*/
void Swap(int &a,int &b)
{
int temp = b;
b = a;
a = temp;
}
//主函数
int main()
{
int a[] = {3,1,8,4,5,7,2,9};//测试数组:偶数情况
quickSort(a,0,7);
int i;
for(i=0;i<8;i++)
printf("%d ",a[i]);
/******************************************************/
printf("\n");
int b[] = {3,9,1,5,7,6,2};//测试数组:奇数情况
quickSort(b,0,6);
for(i=0;i<7;i++)
printf("%d ",b[i]);
/******************************************************/
printf("\n");
int c[] = {4,3,2,7,8,7,9};//测试数组:含重复元素情况
quickSort(c,0,6);
for(i=0;i<7;i++)
printf("%d ",c[i]);
printf("\n");
</span> return 0;
}