剑指Offer系列---(10)快速排序
来源:互联网 发布:水利bim软件 编辑:程序博客网 时间:2024/04/18 18:01
1.题目描述:
快速排序
2.分析:
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移到数组的左边,比选择的数字大的数字移到数组的右边。
3.源代码:
// Copyright (c) 2015年 skewrain. All rights reserved.#include <iostream>#include <time.h>using namespace std;int RandomInRange(int start,int end){ if(end > start) { srand(time(NULL)); return start+rand() % ((end-start)); //产生start~end之间的随机数 } return 0;}void swap_element(int *a,int *b){ int temp; temp = *a; *a = *b; *b = temp;}int Partition(int data[],int length,int start,int end){ if(data==NULL || length<=0 ||start<0 ||end>=length) { cout<<"error!"<<endl; exit(0); } int index = RandomInRange(start, end); swap_element(&data[index], &data[end]); int small=start-1; for (index=start; index<end;index++) { if (data[index]<data[end]) { ++small; if(small != index) { swap_element(&data[index], &data[small]); } } } ++small; swap_element(&data[small],&data[end]); return small;}void Quicksort(int data[],int length,int start,int end){ if (start == end) { return; } int index = Partition(data, length, start, end); if(index>start) Quicksort(data, length, start, index-1); if(index<end) Quicksort(data, length, index+1, end);}int main(int argc,char *argv[]){ int data1[6]={6,2,7,3,8,9}; Quicksort(data1, 6, 0, 5); for(int i=0;i<6;i++) cout<<data1[i]<<" "; cout<<endl; int data2[10]={1,4,7,5,6,10,3,8,2,9}; Quicksort(data2, 10, 0, 9); for(int i=0;i<10;i++) cout<<data2[i]<<" "; cout<<endl; return 0;}
4.小结:
快速排序的最差时间复杂度为O(n^2),最优时间复杂度为O(nlogn),平均时间复杂度为O(nlogn)。快速排序虽然总体的平均效率是最好的,但也不是任何时候都是最优的算法。比如数组本身已经排好序了,而每一轮排序的时候都是以最后一个数字作为比较的标准,此时快速排序的效率只有O(n^2)。
拓展:
经典实现方式:
设要排序的数组是A[0]......A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数据都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的值A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j;(3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交互的时候i,j指针位置不变。另外,i==j这一过程一定正好是i+或者j-完成的时候,此时令循环结束)。
源代码:
#include <iostream>using namespace std;void Qsort(int a[], int low, int high){ if(low >= high) { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ while(first < last) { while(first < last && a[last] >= key) { --last; } a[first] = a[last];/*将比第一个小的移到低端*/ while(first < last && a[first] <= key) { ++first; } a[last] = a[first]; /*将比第一个大的移到高端*/ } a[first] = key;/*枢轴记录到位*/ Qsort(a, low, first-1); Qsort(a, first+1, high);}int main(){ int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24}; Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/ for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { cout << a[i] << " "; } cout<<endl; return 0;}/*参考数据结构p274(清华大学出版社,严蔚敏)*/
- 剑指Offer系列---(10)快速排序
- 【剑指offer】快速排序
- 剑指offer--快速排序
- 剑指offer 快速排序
- 剑指offer 快速排序
- 剑指offer 快速排序
- 快速排序-剑指offer
- 剑指offer-快速排序
- 剑指offer——快速排序
- 【剑指 offer】—— 快速排序
- 剑指Offer——快速排序
- 排序系列--快速排序
- 为了offer系列——快速排序(C++),附测试用例
- 剑指offer--快速排序变形(5、29)
- 剑指offer—第二章算法之快速排序
- 源码系列:快速排序
- 算法系列-快速排序
- 剑指offer系列源码-合并两个排序的链表
- cocos2dx编程 之如何获取节点的中心点坐标
- 30. 函数表达式
- drawable文件夹详解
- mysql索引总结----mysql 索引类型以及创建
- 正确的引用web服务的方式
- 剑指Offer系列---(10)快速排序
- CreaAndroid【1】用注解和反射实现Json自动化解析
- 原子、信号量、互斥锁、自旋锁
- 异步获取数据Ajax,以及对获取的数据进行绑定(显示在页面上)
- jad反编译
- Oracle\MySQL数据库分页查询实例
- 清除Eclipse/MyEclipse下的svn账号密码
- 文章标题
- 机器人坐标变换(一)