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. web.xml中Servlet4.0版本的头信息格式

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...

  2. Maya cmds pymel scriptJob() 和 undoInfo() 在回调中撤销(undo)

    Maya cmds pymel scriptJob() 和 undoInfo() 在回调中撤销(undo) def myEventFun(): cmds.undoInfo(stateWithoutFl ...

  3. Palindrome POJ - 3974 (字符串hash+二分)

    Andy the smart computer science student was attending an algorithms class when the professor asked t ...

  4. yum和rpm

    rpm简介 这是一个数据库管理工具,可以通过读取数据库,判断软件是否已经安装,如果已经安装可以读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Package ...

  5. 按比例缩放DIV

    class ResponsiveDiv extends React.Component { constructor(props) { super(props); this.state = { widt ...

  6. IO操作、PIL使用、Django的admin操作

    操作内存的流-StringIO | BytesIO from io import StringIO, BytesIO #创建操作字符串的内存流 sf = StringsIO() #往内存中写 sf.w ...

  7. MySql数据and高级查询

    1.CREATE TABLE grade(stuID INT AUTO_INCREMENT PRIMARY KEY NOT NULL,stuName VARCHAR(32),stuAge INT ) ...

  8. GMA Round 1 新年的复数

    传送门 新年的复数 已知$\left\{\begin{matrix}A>B>0\\ AB=1\\ (A+B)(A-B)=2\sqrt{3}\end{matrix}\right.$ 求$(A ...

  9. React_生命周期

    初始化 ReactDOM.render(jsx, 原生 DOM 对象): 组件类定义 static defaultProps = {} static propTypes = {} constructo ...

  10. Nestjs Graphql

    文档 工作示例 安装依赖: npm i --save @nestjs/graphql apollo-server-express graphql-tools graphql app.module.ts ...