写出一个较好的高速排序程序

  • 高速排序是经常使用的排序算法之中的一个,但要想写出一个又快又准的使用程序,就不是那么简单了

须要注意的事项

  • 首先要写正确。通常使用递归实现。其递归相当于二叉树展开,因此假设要用迭代实现的话须要使用一个队列来保存兴许遍历信息。
  • 高速排序须要找到一个pivot值,假设顺序选择pivot则易造成N^2的复杂度,假设使用随机数则效果最好,但开销又太大,採取三数中值法比較合适。三数中值法指的是选取第一个值,最后一个值,数组中间的值的中值。有文献表明能够提升5%的执行时间。
  • 当数组长度较小时,如10个元素下面,最好使用插入排序或者选择排序完毕,以防止复杂度常数因子过大或多次函数调用带来的开销。而递归究竟层数组长度总是会变小的,因此这么做很有必要。
  • 在合并前后两部分数组时,採用两边夹方法,在前后两部分各找到一个大于和小于的值再交换。相比通常情况下找到比pivot小的值就进行交换,能提高执行效率。

实现代码

  • 代码例如以下。包含插入排序insert_sort,递归函数,三分中值函数三个辅助函数。
  • 三分中值函数事实上採用的是插入排序。通过三次比較,确定中值。
  • 插值算法使用暂时变量tmp避免了大量swap函数调用。
#include<iostream>
#include<iomanip>
#include<vector>
#include<cstdlib>
#include<ctime>
#include<algorithm>using namespace std;inline void swap(vector<int>& num, int p, int q){int t = num[p];num[p] = num[q];num[q] = t;
}void insert_sort(vector<int>& num){int tmp, j;for (int i = 1; i < num.size(); i++){tmp = num[i];for (j = i - 1; j >= 0 && num[j] > tmp; j--)num[j + 1] = num[j];num[j + 1] =tmp;}
}int quick_sort_sub(vector<int>& num, int p, int q){if (p >= q)return 0;// if 4 elements or less, use insert sortif (p + 10 > q){vector<int> tnum(num.begin() + p, num.begin() + q + 1);insert_sort(tnum);for (int i = 0; i < tnum.size(); i++)num[p + i] = tnum[i];}int idx = quick_three_partition(num, p, q);swap(num, idx, q);int pivot = num[q];int left = p, right = q - 1;while (1){while (num[left] < pivot)++left;while (num[right] >= pivot)--right;if (left < right)swap(num, left, right);elsebreak;}swap(num, left, q);quick_sort_sub(num, p, left - 1);quick_sort_sub(num, left + 1, q);return left;
}void quick_sort(vector<int>& num){quick_sort_sub(num, 0, num.size() - 1);
}int main(){const int n = 10;/*int num_array[n]= {2,1};vector<int> num(num_array, num_array + n);*/srand( time(NULL) );vector<int> num(n);for (auto& e : num)e = rand() % n;quick_sort(num);for (auto& e : num)cout << setw(4) << e << ' ';cout << endl;cout << "vector is sorted? : " << is_sorted(num.begin(), num.end()) << endl;return 0;}

 
 

转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

怎样写出一个较好的高速排序程序相关推荐

  1. 如何写出一个较好的快速排序程序

    写出一个较好的快速排序程序 快速排序是常用的排序算法之一,但要想写出一个又快又准的使用程序,就不是那么简单了 需要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此如果要用迭代实 ...

  2. linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!

    今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫: select record.a, y.c ...

  3. 写出一个缓存系统的伪代码001

    /*** 写出一个缓存系统的伪代码*/ public class CacheDemo {private Map<String, Object> map = new HashMap<S ...

  4. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  5. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  6. 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

    给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...

  7. 用c语言写出一个金字塔

    如何用c语言写出一个金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main(){int i;//用户想要的层数int ...

  8. 写出一个类People,并由该类做基类派生出子类Employee和Teacher

    写出一个类People,并由该类做基类派生出子类Employee和Teacher.其中People 类具有name.age两个保护成员变量,分别为String类型.整型,且具有公有的getAge成员函 ...

  9. 用PV操作写出一个不会出现死锁的哲学家进餐问题

    用PV操作写出一个不会出现死锁的哲学家进餐问题 用count限定只能有四个哲学家同时拿起第一根筷子.这样就不会出现没有筷子拿的死锁. semaphore stick[5]={1,1,1,1,1}; s ...

最新文章

  1. linux修正系统错误指令fsck和badblocks
  2. ASP.NET 2.0 正式版中无刷新页面的开发
  3. 字节跳动最新开源!java语言程序设计进阶篇
  4. 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
  5. Redux 源码解析系列(一) -- Redux的实现思想
  6. gitlab添加用户
  7. php自动跳转函数,迅睿CMS 重写控制网站自动跳转函数
  8. 【mysql知识点总结】
  9. Elasticsearc 6.x以后不再支持mapping下多个type
  10. SAVIOR Securing Autonomous Vehicles with Robust Physical Invariants
  11. ue4蓝图运行顺序_如何从零基础慢慢学习到UE4的顺序?
  12. 搭建一个属于自己的服务器,并实现内网穿透(外网访问本地服务器功能)
  13. 滴滴出行怎么下载丨办法总比困难多
  14. F - Ilya Muromets Gym - 100513F
  15. 关于浏览器UA的一些介绍
  16. 微型计算机开不了机,联想C225微型计算机怎么开不起机呢?
  17. 计算机cpu的速度越来越快 这导致,计算机一级笔试模拟题(1-6)
  18. 7大爱好来提高编程技能
  19. mysql varchar 单引号_char、varchar数据类型值在使用时可以要用单引号或双引号括起来。...
  20. 计算机语言中的逻辑异或的应用,异或同或门逻辑符号_利用或门和非门设计的异或门方案...

热门文章

  1. 百度PHP高级顾问惠新宸:PHP在百度的发展历程
  2. 搜索引擎中的URL散列
  3. ASP.Net中利用CSS实现多界面两法
  4. 一种解决启动进程传递参数过长的方法
  5. C++/C++11中头文件iterator的使用
  6. 设计模式之访问者模式(Visitor)摘录
  7. opencv实现二值图像细化的算法
  8. 查看matlab中函数源代码的方法
  9. 【Go】Go基础(五):函数
  10. java servlet html文件_Servlet生成html页面