1. 快速排序

不稳定的排序。

平均(与最好情况)时间复杂度:O(nlgn)   |  最坏情况时间复杂度(元素有序,递归栈为 O(n)):O(n2)

适合的数据结构:数组,双向链表。

#include <stdio.h>
#include <stdlib.h>
int partition(int data[], int low, int high)
{
int value = data[low]; // can be done randomly
while(low < high)
{
while(low < high && data[high] >= value) --high;
data[low] = data[high];
while(low < high && data[low] <= value) ++low;
data[high] = data[low];
}
data[low] = value;
return low;
}
void QuickSort(int data[], int low, int high)
{
if(low < high)
{
int mid = partition(data, low, high);
QuickSort(data, low, mid);
QuickSort(data, mid+1, high);
}
}
void init(int data[], int length)
{
for(int i = 0; i < length; ++i)
data[i] = rand() % 10000;
}
int main()
{
enum{ N = 5000};
int numbers[N] = {0};
init(numbers, N); // if commented out, the numbers is ordered, the stack is N, then overflow!
QuickSort(numbers, 0, N-1);
for(int i = 0; i < N; ++i)
printf("%d\t", numbers[i]);
printf("\n");
return 0;
}

2. 希尔排序

直接插入排序的改进,是不稳定的排序。

Shell’s Sort 又称“缩小增量排序”。

增量序列必须满足:没有除 1 之外的公因子,最后增量值等于 1 。

增量的取法:

dlta[ k ] = 2t-k+1 - 1 时,时间复杂度为 O(n3/2),其中 t 为排序趟数,1 ≤ k ≤ t ≤ floor(log2(n+1))。

dlta[ k ] = 2t-k + 1,0 ≤ k ≤ t ≤ floor(log2(n-1))。1, 2, 3, 5, 9…

dlta[ k ] = 1/2(3t-k - 1),0 ≤ k ≤ t ≤ floor(log3(2n+1))。1, 4, 13, 40…

适合的数据结构: 数组, 双向链表。

#include <stdio.h>
#include <stdlib.h> void ShellInsert(int data[], int length, int dk)
{
int temp, j;
for(int i = dk; i < length; ++i)
{
temp = data[i];
for(j = i-dk; j >= 0 && data[j] > temp; j -= dk)
data[j+dk] = data[j];
data[j+dk ]= temp;
}
}
void ShellSort(int data[], int length, int dlta[],int t) /* t 为排序趟数 and dlta 长度 */
{
for(int k = 0; k < t; ++k)
ShellInsert(data, length, dlta[k]);
} void init(int data[], int length)
{
for(int i = 0; i < length; ++i)
data[i] = rand();
}
int main()
{
enum{ N = 100000};
int dlta[] = {7, 3, 1};
int numbers[N] = {0};
init(numbers, N);
ShellSort(numbers, N, dlta, 3); /* 3 为a排序趟数 and dlta 长度 */
for(int i = 0; i < N; ++i)
printf("%d\t", numbers[i]);
printf("\n");
return 0;
}

3. 直接插入排序

稳定的排序。

时间复杂度 O(n2)。

适合的数据结构: 数组,双向链表。

void InsertSort(int data[], int length)
{
int j;
for(int i = 1; i < length; ++i)
{
if(data[i] < data[i-1])
{
int value = data[i];
//data[i] = data[i-1];
for(j = i-1; j >= 0 && data[j] > value; --j)
data[j+1] = data[j];
data[j+1] = value;
}
}
}

快速排序 && 希尔排序 && 插入排序的更多相关文章

  1. JS快速排序 希尔排序 归并排序 选择排序

    /* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...

  2. 排序---希尔排序Java

    希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...

  3. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  4. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  5. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  6. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  8. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  9. 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序

    最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例:  输入:[1,2,3,5,2, ...

随机推荐

  1. DownloadManager补漏

    原始完成于:2014-10-24 20:01:03 DownloadManager是一个处理HTTP下载请求的系统服务: 1. 基本用法 1 private void download() { 2 R ...

  2. JS日期的获取与加减

    1)获取当前日期: var today = new Date(); 2)设定某个日期: var d = new Date("2015/1/08".replace(/-/g,&quo ...

  3. Toward Scalable Systems for Big Data Analytics: A Technology Tutorial (I - III)

    ABSTRACT Recent technological advancement have led to a deluge of data from distinctive domains (e.g ...

  4. hadoop优化之拙见

    map-reduce的优化: 需要内存的地方:  map/reduce任务运行时内存.存放中间数据的内存缓存区.map输出数据排序内存, 需要操作磁盘的地方: map输出数据缓冲区达到阀值的溢出写文件 ...

  5. GO RPC

    HTTP RPC SERVER CODE package main import ( "errors" "fmt" "net/http" & ...

  6. Oracle数据库初级学习

    第一天 SQL查询语句 CMD——SQLPLUS----账号 soctt 密码 tiger,输入完成后进入SQL数据库,如图显示即连接成功. 连接成功后 ,我们首先设置一下基本界面, --设置 每列显 ...

  7. linux的七种文件类型

    d 目录 - 普通文件 l 符号链接 s 套接字文件 b 块设备文件 二进制文件 c 字符设备文件 p 命名管道文件

  8. sed命令的基本使用

    sed(Stream Editor):流编辑器 一次只读取一行 模式空间 1.sed语法: sed [option] "script" FILE... 2.选项: -n:静默模式, ...

  9. 关于HTML标签(元素)的那些事?

    关于HTML标签(元素)的那些事? 在战场上,知己知彼,方能百战百胜:在商场上,知己知彼,亦能呼风唤雨:在情场上,知己知彼,才能幸福美满.当然啦,在我们前端开发上,亦要知己知彼,才能叱咤风云.关于HT ...

  10. mysql source命令超大文件导入方法总结

    本文章来给各位朋友介绍利用mysql source命令超大文件导入方法总结,下面收集了两种解决办法,一种是把数据库分文件导出然后再导入,另一种是修改my.ini配置文件,下面我一一给各位朋友介绍. 导 ...