快速排序是一种划分交换排序,他采用的思想是分治法。
分治法的基本思想是将原来问题分解为若干个规模很小的机构与原来问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。
①。简单快速排序算法:(a、以第一个元素为分界 b、有重复元素时效率低)
时间复杂度O(nlogn),空间复杂度O(logn)。
其实现的伪代码:
void qsort1(l, u)
if(l >= u) return;
m = l;
for i = [l+1 , u]
if(x[i] < x[l])
swap(++m, i)
swap(l , m)
qsort1( l, m-1)
qsort1(m+1, u)
由于简单快速排序算法是以第一个元素为分界进行分治的,所以这仅适用于随机序列,针对这种情况,则有了改进的快速排序算法:
②。用随机函数在序列中取随机值,然后与x[l] 交换,然后同①方法进行快速排序。
由于简单快速排序对有重复元素时的效率比较低,所以针对这种情况的一种改进快速排序算法:
③。使用Partition划分算法:
代码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
void improveqsort(int *list, int m, int n)
{
int k,t,i,j;
if(m < n)
{
i=m;
j= n+1;
k= list[m];
while(i<j)
{
for(i = i+1; i<n; i++)
if(list[i] >= k)
break;
for(j = j-1; j>m; j--)
if(list[j] <= k)
break;
if(i<j)
{
t= list[i]; list[i] = list[j]; list[j] = t;
}
}
t = list[m]; list[m] = list[j]; list[j] = t;
improveqsort(list,m,j-1);
improveqsort(list,i,n);
}
}
int main()
{
int list[10];
int n=9, m=0, i;
printf("Input 10 number: ");
for(i = 0; i<10 ; i++)
scanf("%d",&list[i]);
printf("\n");
improveqsort(list,m,n);
for(i=0;i<10;i++)
printf("%5d",list[i]);
printf("\n");
return 0;
}
这种双向划分的方法就避免了序列中有重复元素时效率低的问题。
注:在C中有库函数qsort,但是比上述qsort1速度要慢,因为其通用接口对每次比较都使用函数调用。
但是C++ 库函数sort 拥有最简单的接口,非常高效,可以直接用。