quicksort中,当n小于一定值时,排序效率就比直接插入排序底了,所以,此时就不要再递归下去了,直接插入排序好了;快速的原理就是因为折半递归,所以初始pivot应该有个好一点的选择,这里在原序列左右和中间序的值取中值作为pivot,位置仍然放置于左侧第一元素位置(交换)。

这就变成了工程优化的快速排序了

——————————————————————————————————————————————————

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void insertsort(int arr[], int left, int right)
{
int temp, i, j;
for (i=left+1; i<=right; i++)
{
if (arr[i]<arr[i-1])
{
temp = arr[i];
for(j=i-1; j>=left&&temp<arr[j]; j--)
{
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
}

int partition(int arr[], int low, int high)
{
int i = low, j = high, pivot = arr[low];
while (i<j)
{
while (i<j&&arr[j]>=pivot)
{
j--;
}
if (i<j)
{
arr[i] = arr[j];
i++;
while (i<j&&arr[i]<=pivot)
{
i++;
}
if (i<j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = pivot;
return i;
}

void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

void median3_alignleft(int arr[], int left, int right)
{
int mid = (left+right)/2, k1, k2;
if (arr[left]<=arr[mid])
{
k1 = left;
k2 = mid;
}
else
{
k1 = mid;
k2 = left;
}
if (arr[right]<arr[k1])
{
k2 = k1;
}
else if (arr[right]<arr[k2])
{
k2 = right;
}
if (k2!=left)
{
swap(arr, k2, left);
}
}

void quicksort_insert(int arr[], int left, int right, int M)
{
if (right-left<=0)
{
return;
}
if (right-left+1<M)
{
insertsort(arr, left, right);
}
else
{
median3_alignleft(arr, left, right);
int pivotpos = partition(arr, left, right);
quicksort_insert(arr, left, pivotpos-1, M);
quicksort_insert(arr, pivotpos+1, right, M);
}
}

void main()
{
int arr[] = {99, 29, 17, 11, 36, 55, 47, 2, 3, 8, 12, 66};
int len = sizeof(arr)/sizeof(int);

quicksort_insert(arr, 0, len-1, 5);

for(int i=0; i<len; i++)
{
printf("%d ", arr[i]);
}

printf("\n");
}

//result

# ./sort
2 3 8 11 12 17 29 36 47 55 66 99

Finally:

M可以固定取值5-25之间任意数

这个可以作为自实现算法库来保留了,你的C工程里最好能有它。

快速排序 之添加复合插入排序和原始序列取中值左pivot的更多相关文章

  1. Entity Framework中的实体类添加复合主键

    使用Code First模式实现给实体类添加复合主键,代码如下: using System; using System.Collections.Generic; using System.Compon ...

  2. [Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题

    本篇读书笔记主要记录QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题   大纲:     复合模式     双缓冲绘图     绘图中的其他问题       ...

  3. 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

    32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...

  4. jquery attr()方法 添加,修改,获取对象的属性值。

    jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...

  5. 48. leetcode 105题 由树的前序序列和中序序列构建树结构

    leetcode 105题,由树的前序序列和中序序列构建树结构.详细解答参考<剑指offer>page56. 先序遍历结果的第一个节点为根节点,在中序遍历结果中找到根节点的位置.然后就可以 ...

  6. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  7. Windows中添加自己的程序到开机启动中(添加服务,添加注册表)

    在系统启动的时候启动自己想要启动的程序: 方法一:利用开机启动文件夹 将exe文件或exe文件的快捷方式复制到(启动)文件夹下 以win7为例:开始→所有程序→启动→鼠标右键打开 方法二:添加系统服务 ...

  8. Java由先序序列和中序序列还原二叉树

    还原本来的二叉树并不是一个非常简单的事,虽然思想比较简单,但过程却是比较繁琐.下面我拿先序序列和中序序列来讲一下原理吧. 从先序序列中我们一下子就可以得到二叉树的根节点是第一个元素,然后再中序序列中我 ...

  9. 如何添加“在这里打开PowerShell”到Windows中的上下文菜单

    It was only a matter of time, right? Due to my recent infatuation passionate love affair with PowerS ...

随机推荐

  1. Xcode 中armv6 armv7 armv7s arm64 i386 x86_64 归纳 (Architectures, Valid Architectures, Build Active Architecture Only)

    http://www.jianshu.com/p/09b445300d40 简介: armv7|armv7s|arm64都是ARM处理器的指令集 i386|x86_64 是Mac处理器的指令集 目前i ...

  2. 金蝶K/3 BOS产品培训教案

    K/3 BOS产品培训教案     1 K/3 BOS IDE练习案例... 2 1.1新建基础资料... 2 1.1.1新增基础资料交货地点... 2 1.2新建业务单据... 2 1.2.1新建寄 ...

  3. ASP.NET 多环境下配置文件web.config的灵活配置

    调试,发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常常有调试,发布的需求,就需要常常修改web.config文件,这往往 ...

  4. 对屏幕的理解---分辨率,dpi,ppi,屏幕尺寸,像素 等

    1. 名词理解 屏幕尺寸(screen size) 屏幕尺寸(screen size),是屏幕的对角线长度,一般讲的大小单位都是英寸. DPI (dots per inch) dpi 是(英文Dots ...

  5. vue v-cloak知识点

    1.使用 v-cloak 属性可以解决插值表达式闪烁问题;     2.v-text默认是没有闪烁的问题,同时会覆盖元素中原本的内容,但是v-cloak只会替换 自己的这个占位符,不会替换所有的字符 ...

  6. 用es6方式的写的订阅发布的模式

    //发布订阅模式 class EventEmiter { constructor() { //维护一个对象 this._events = { } } on(eventName, callback) { ...

  7. 使用Python下载文件

    python -c "with open('/tmp/file.sh', 'wb') as f: import urllib2; f.write(urllib2.urlopen('http: ...

  8. ListView 上拉加载更多

    ListView 上拉加载更多 首先来个效果图 界面布局 <?xml version="1.0" encoding="utf-8"?> <Re ...

  9. 原生js实现双向数据绑定

    一.两个model之间的双向绑定 var o = { a: 0 } o.b = o.a + 1; console.log(o.a); // "0" console.log(o.b) ...

  10. 【CF765F】Souvenirs 主席树

    [CF765F]Souvenirs 题意:给你一个长度为n的序列{ai},有m个询问,每次询问给出l,r,问在所有$l\le x < y\le r$中,$|a_x-a_y|$的最小值是多少. $ ...