快速排序结合插入排序

继上一篇堆排序之后,用相同的数据结构写了个快速排序和插入排序,当数组的长度较小的时候,可使用插入排序,实现如下:

QuickSort.h


 1 #ifndef __QUICKSORT
2 #define __QUICKSORT
3 #include "MySqList.h"
4 #include "InsertSort.h"
5
6 template <typename Type>
7 void QuickSort(MySqList<Type>* L, int low, int high)
8 {
9 if(high==low)
10 return;
11 else if(high-low < 6)
12 InsertSort(L, low, high);
13 else
14 {
15 int temp = Partition(L, low, high);
16 QuickSort(L, low, temp-1);
17 QuickSort(L, temp+1, high);
18 }
19 }
20
21 template <typename Type>
22 int Partition(MySqList<Type>* L, int low, int high)
23 {
24 int temp = (low+high)/2;
25 while(low<high)
26 {
27 while(low<high&&L->get(high)>L->get(temp))
28 high--;
29 L->swap(temp, high);
30 temp = high;
31
32 while(low<high&&L->get(low)<L->get(temp))
33 low++;
34 L->swap(temp, low);
35 temp = low;
36 }
37 return temp;
38 }
39
40 #endif

InsertSort.h


 1 #ifndef __INSERTSORT
2 #define __INSERTSORT
3 #include "MySqList.h"
4 template <typename Type>
5 void InsertSort(MySqList<Type>* L, int low, int high)
6 {
7 if(!L)
8 return;
9 if(high==low)
10 return;
11 int min_id;
12 for(int i = low; i<=high; i++)
13 {
14 min_id = i;
15 for(int j=i+1; j<=high; j++)
16 {
17 if(L->get(j)<L->get(min_id))
18 min_id = j;
19 }
20 L->swap(i,min_id);
21 }
22 }
23 #endif

main.cpp


 1 #include "MySqList.cpp"
2 #include "InsertSort.h"
3 #include "QuickSort.h"
4 int main()
5 {
6 int b[9]={1,6,7,8,9,256,3,4,5};
7 int len = sizeof(b)/sizeof(int);
8 MySqList<int > *L = new MySqList<int>(len,b);
9 QuickSort(ls, 0, ls->Len()-1);
10 }

当数组长度小于等于5时,用插入排序。

快速排序的中间值选择方法可以改进。希望对大家有用。

快速排序结合插入排序,布布扣,bubuko.com

时间: 2024-10-13 23:42:34

快速排序结合插入排序的相关文章

快速排序/二分插入排序的swift以及Java实现

经常会用到排序的算法,比如:冒泡法,选择法,快速排序,二分插入排序等等.前面两个就不说了,贴出来自己写的快速排序和二分插入排序的Swift及Java的代码实现,喜欢的话control+C拿去用. swift实现快速排序和二分插入排序算法: (想运行的话,直接复制代码,替换掉控制器里的viewDidLoad方法就好了) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading

图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

图形化排序算法比较:快速排序.插入排序.选择排序.冒泡排序

冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析

冒泡排序 1 //冒泡排序 2 ////////////////////////////////////////////////////////////////////////// 3 void BubleSort(int a[],int n) 4 { 5 int temp; 6 bool flag=false; 7 for (int i=0;i<n;i++) 8 { 9 flag=true; 10 for (int j=0;j<n-i-1;j++) 11 { 12 if(a[j]>a[

算法导论:快速排序和插入排序

代码实现 1 #ifndef _SORT_H 2 #define _SORT_H 3 4 // goal: quicksort and insertsort 5 // time: 12/2/2014 6 // author: zrss 7 // reference: introduction to algorithms 8 9 class Sort { 10 public: 11 void quickSort(int A[], int p, int r); 12 void insertSort(

浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)

由于没考虑到一些情况,对以上一些算法做了改进和对比!以及昨晚把希尔排序写错而误以为其效率高过快速排序的糗事,今天一一做了更正和说明,如果你绝得本随笔不是很妥可以尝试看看这http://www.cnblogs.com/maxiaofang/p/3382927.html,有错误或不妥欢迎指正!!共同学习,共同进步!O(∩_∩)O哈哈~ 推荐一段博友分享的排序视频很艺术.很形象.很生动哦(http://www.oschina.net/question/561584_65522) 最近一段时间去武汉参加

五种排序算法整理 二(堆排序,快速排序、插入排序、选择排序、冒泡排序)

一.快速排序算法步骤: 1. 在数组中选一个基准数(通常为数组第一个): 2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边: 3. 对于基准数左.右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序. 实例演示 1.将第一个元素49设置为基准,low=0,high=7. 因为49不小于49,所以不换位置,high--. 2.27小于49,所以27和49互换位置(图上没有显示出来,但这并不影响)low++ 3.我们再从基准49的位置和low对应的38比较,发

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序

算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. //冒泡排序(排序10000个随机整数,用时约145ms) func bubbleSort(nums []int) { for i

算法导论-排序(二)快速排序、随机化快速排序

目录 1.本文介绍 2.快速排序 3.随机化快速排序 4.完整源码 5.参考资料 内容 1.本文介绍 主要内容分为两部分,一部分是介绍快速排序算法,分析其在最好.最坏以及最好最差交替出现情况下的算法效率:另一部分则是介绍随机化快排算法,以及分析其算法复杂度.最后给出c++实现代码. 2.快速排序 快速排序也是基于分治思想,首先把要排序的数组分为两份,然后再分别对分好的子数组进行快速排序.当子数组为1个元素时递归介绍,排序完成.快速排序属于“原地排序”,就是说在原有的数组内存上排序.不占用其他内存

排序算法入门之快速排序(java实现)

快速排序也是一种分治的排序算法.快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序,会需要一个额外的数组:而快速排序的排序方式是当两个子数组都有序时,整个数组就自然有序了,快速排序可以不产生额外的数组. 对于小数组(N<=20),快速排序不如插入排序.所以,小数组建议使用其他排序. 快速排序可以由以下几步组成: 1.如果数组S中的元素个数是0或1,则返回. 2.取S中任一元素v,称为枢纽元. 3.将S中其余元素(除枢纽元)分为两部分,一部分是小