快速排序,平均运行时间O(N log N),最坏运行时间O(N^2)。

  我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解。

整体思路:

  首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部

分利用快排。

具体细节:

  1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,严重影响排序效率。

为了尽可能消除这种影响,同时取数组中的索引为0,n-1,和中值中的中间值作为pivot。产生pivot的时候,0,n-1

位置上的值已经满足pivot的要求,所以排序时候不需要再考虑,所以把pivot的值保存再n-2位置上。

  2.为了把数组划分为两部分,利用双指针i,j。i从前往后掠过小于pivot的值,j从后往前掠过大于pivot的

值,当i,j停止的时候,如果i<j,交换i,j所指位置上的值,否则break;

  3.在小的数组中(数组的大小<cutoff),快排的效率并不高,所以小数组时候利用插入排序

 1 void quicksort(int *nums,int n)
 2 {
 3     qs(nums,0,n-1);
 4 }
 5 void qs(int*nums,int left,int right)
 6 {
 7     int pv;
 8     int i,j;
 9     int cutoff=10;
10     if(left+cutoff<=right)
11     {
12         pv=mid3(nums,left,right);
13         i=left;
14         j=right-1;
15         while(1)
16         {
17             while(nums[++i]<pv);
18             while(nums[--j]>pv);
19             if(i<j)
20                 swap(nums[i],nums[j]);
21             else
22                 break;
23         }
24         swap(nums[i],nums[right-1]);
25         qs(nums,left,i);
26         qs(nums,i+1,right);
27     }
28     else
29         intersort(nums+left,right-left+1);
30 }
31 int mid3(int *nums,int left,int right)
32 {
33     int center=(left+right)/2;
34     if(nums[left]>nums[center])
35         swap(nums[left],nums[center]);
36     if(nums[left]>nums[right])
37         swap(nums[left],nums[right]);
38     if(nums[center]>nums[right])
39         swap(nums[center],nums[right]);
40     swap(nums[center],nums[right-1]);
41     return nums[right-1];
42 }
43 void swap(int &m,int &n)
44 {
45     m^=n;
46     n^=m;
47     m^=n;
48 }
49 void intersort(int *nums,int n)
50 {
51     int i,j;
52     int tmp;
53     for(i=1;i<n;i++)
54     {
55         tmp=nums[i];
56         for(j=i;j>0&&tmp<nums[j-1];j--)
57             nums[j]=nums[j-1];
58         nums[j]=tmp;
59     }
60 }

转载于:https://www.cnblogs.com/fcyworld/p/6175605.html

【Sort】QuickSort相关推荐

  1. CCF NOI1041. 志愿者选拔【sort】

    原题链接:1041. 志愿者选拔 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A市对所有 ...

  2. 【算法】QuickSort

    快速排序,时间复杂度O(N*logN),要能熟练掌握! 以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主! 该 ...

  3. leecode#1051【数组】:高度检查器

    自己写的,排序之后比较,也是最慢的一种方法 class Solution:def heightChecker(self, heights: List[int]) -> int:s=0he1 = ...

  4. head在c语言中的作用,阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。【说明】 函数sort (NODE *head)的功能 - 赏学吧...

    阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内. [说明] 函数sort (NODE *head)的功能是:用冒泡排序法对单链表中的元素进行非递减排序.对于两个相邻结点中的元素,若较小的 ...

  5. Python实训day03am【sort、函数式编程、过滤器、lambda、文本文件读写】

    Python实训-15天-博客汇总表 目录 1.字典练习题 2.排序sort 2.1.Java中的sort 2.2.sort与lambda 3.函数式编程与过滤器filter 4.Java中的lamb ...

  6. 【Linux】一步一步学Linux——sort命令(53)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 sort命令是在Linux里非常有用,它将文件进行排序,并 ...

  7. 【排序】LeetCode 75. Sort Colors

    LeetCode 75. Sort Colors Solution1: 参考自:<leetcode-cpp 答案> 由于0,1,2非常紧凑,首先想到计数排序(counting sort), ...

  8. 【归并排序】【逆序数】HDU 5775 Bubble Sort

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...

  9. 【算法】快速排序算法的编码和优化

    参考资料 <算法(第4版)>          - - Robert Sedgewick, Kevin Wayne <啊哈! 算法>              - - 啊哈磊 ...

  10. 数据结构与算法【Java】05---排序算法总结

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

最新文章

  1. [导入]ZT笑到内伤:史上最雷,最爆寒的电影字幕
  2. centos6.5 tar安装mysql_centos6.6安装mysql5.7.9tar包
  3. 深入Java集合学习系列:ConcurrentHashMap之实现细节
  4. This in JavaScript
  5. 交换机虚拟化和堆叠的区别_交换机级联与堆叠有何区别
  6. 智能家居系统通信方式,主要有以下四种
  7. perl删除Windows下的图片缓存缩略图(Thumbs.db)
  8. 基本地图加载完整示例
  9. 在linux上使用scp命令拷贝一个目录到另一台服务器的时候报not a regular file错误的解决办法...
  10. ZigBee协议栈简介
  11. 应广单片机及mini-c快速入门
  12. 分布临界值表python
  13. 关于12306车票个人信息的泄露
  14. 数据库与php衔接,【杂谈】PHP怎样衔接Mysql数据库
  15. 柿饼模组 -- 实现超声波模块测距显示界面
  16. php com操作word,php 操作word 的使用com组件的总结
  17. form表单如何不直接提交?
  18. 【图书管理系统】附源码+教程
  19. RecyclerView+ImageLoader打造多选图库
  20. 有了这8款Mac安全杀毒和流氓防护软件,让你的mac清理优化,更加安全

热门文章

  1. 《Windows游戏编程大师技巧》五、DirectX基础知识和令人生畏的COM
  2. jQuery验证框架教程
  3. 一起学习MVC(4)-entity SQL语句
  4. 如何处理Ibatis结合MySQL数据库使用时的事务操作
  5. 使用Navicat for MySQL设置定时备份数据库和数据恢复
  6. Asp.Net删除文件夹后引起Session丢失的解决办法
  7. cloudflare 关于tls 检测,发送未知message type字节
  8. Git 分支管理最佳实践(转载)
  9. 28. (附加)八皇后问题(C++版本)
  10. 英文课程名称 c语言程序设计,课程名称C语言程序设计I.doc