快速排序_排序算法
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]就以排序好。
快速排序的最坏情况下的时间复杂度为:O(n^2),平均为O(nlogn);快速排序算法的性能取决划分的对称性。通过修改函数partition,可以设计随机选取策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在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; }
相关文章推荐
- 排序算法之 快速排序 及其时间复杂度和空间复杂度
- 排序算法 之 快速排序 QuickSort
- [排序算法]--快速排序的Java实现
- 排序算法之快速排序
- 排序算法之快速排序
- java排序算法1 快速排序
- 排序算法(六):快速排序
- 排序算法-交换排序_快速排序
- 【排序算法】快速排序
- 排序算法2---快速排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 常用排序工具类:标准【正序、倒序】排序算法‘冒泡排序,选择排序,快速排序’
- 排序算法-快速排序
- 排序算法‘冒泡排序,选择排序,快速排序’
- 快速排序-最重要的排序算法
- 排序算法--冒泡排序,归并排序,快速排序
- 排序算法——快速排序
- 排序算法 快速排序 归并排序 堆排序
- 排序算法六:快速排序
- 几种排序算法的C++实现——快速排序、堆排序、基数排序