您的位置:首页 > 其它

快速排序_排序算法

2014-06-06 15:52 274 查看
快速排序算法是基于分治策略的一种排序算法。其基本思想是,对于输入的子数组a[s:e],按照如下的三个步骤进行排序:

(1)分解:以a[q]为基准元素将a[s:e]划分成3段a[s:q-1],a[p]及a[q+1:e],使得a[s:q-1]中的任何一个元素都不大于a[q],使得a[q+1:e]中的任何一个元素都不小于a[q],下标q在划分过程中确定;

(2)递归求解:通过递归调用快速排序算法分别对a[s:q-1]和a[q+1:e]进行排序。

(3)合并:由于对a[s:q-1]和a[q+1:e]的排序是就地进行的,所以a[s:q-1]和a[q+1:e]都已排序好,不需要执行任何计算,a[s:e]就以排序好。

//QuickSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
void outputArray(int *a,int len){

printf("数组为:");
for (int i=0;i<len;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}

void swap(int &x,int &y){
int tmp=x;
x=y;
y=tmp;
}
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 quickSort(int *a,int s,int e){

if(s<e){
int q=partition(a,s,e);
quickSort(a,s,q-1);
quickSort(a,q+1,e);
}

}
int _tmain(int argc, _TCHAR* argv[])
{
int a[6]={3,6,2,5,3,1};
outputArray(a,6);
quickSort(a,0,5);
outputArray(a,6);
getchar();
return 0;
}


快速排序的最坏情况下的时间复杂度为:O(n^2),平均为O(nlogn);快速排序算法的性能取决划分的对称性。通过修改函数partition,可以设计随机选取策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在a[s:e]中随机选择一个元素作为划分基准,这样的可以使得划分基准的选择是随机的,从而可以期望划分是较对称的。随机划分的算法是实现如下:

//QuickSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
void outputArray(int *a,int len){

printf("数组为:");
for (int i=0;i<len;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}

void swap(int &x,int &y){
int tmp=x;
x=y;
y=tmp;
}
/************************************************************************/
/* 划分,左右每部分的排序就地进行                                                                     */
/************************************************************************/
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;
}
/************************************************************************/
/* 产生随机划分                                                                     */
/************************************************************************/
int randomPartition(int *a,int s,int e){
srand((unsigned )time(NULL));
int i=s+rand()%(e-s);
swap(a[s],a[i]);
return partition(a,s,e);
}
/************************************************************************/
/* 对左右不分递归进行排序                                                                     */
/************************************************************************/
void randomQuickSort(int *a,int s,int e){

if(s<e){
int q=randomPartition(a,s,e);
randomQuickSort(a,s,q-1);
randomQuickSort(a,q+1,e);
}

}
int _tmain(int argc, _TCHAR* argv[])
{
int a[6]={3,6,2,5,3,1};
outputArray(a,6);
randomQuickSort(a,0,5);
outputArray(a,6);
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: