快速排序 && 希尔排序 && 插入排序
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;
}
}
}
快速排序 && 希尔排序 && 插入排序的更多相关文章
- JS快速排序 希尔排序 归并排序 选择排序
/* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...
- 排序---希尔排序Java
希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
- 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: 输入:[1,2,3,5,2, ...
随机推荐
- linux命令每日一练习-mkdir,rm
mkdir 创建一个文件夹 mkdir -p tian/hong 递归创建文件目录 mkdir tian hong 创建多个文件 mkdir -v tian 创建文件的时候显示信息 mkdir -m ...
- 谈谈eclipse使用技巧二
上节说道了怎么使用eclipse使您事半功倍.这节告诉您怎么用eclipse练成火眼金睛. ①借你一双火眼金睛让类的层次结构一目了然让你阅读代码如虎添翼 一个好的类的层次结构,让你的类的层次清晰明了, ...
- cookie窃取和session劫持
Updates 2014-08-17 感谢@搞前端的crosser的提醒,加入了HTTP Response Splitting的内容. 此篇文章的Presentation戳这里. 一.cookie的基 ...
- HTMl5-canvas 入门级复习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Git工作流指南:Pull Request工作流
参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...
- 关于在win7内集成usb3.0驱动。
mac air 装了win7但是折腾良久还是无法升级,只能是重新安装. 很蛋疼.bootcamp 老是找不到驱动.只能是手动分区后U盘引导安装. 驱动的下载,直接在Os x 下用bootcamp 下载 ...
- Swiper说明&&API手册
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...
- while do while 穷举和迭代
新内容1:while循环 格式: while() { } 初始状态要在循环外提前规定 状态改变要写在花括号里面 括号内是循环条件 for循环与while循环的对比: 穷举: 迭代:
- MMDrawerController 的使用
1.AppDelegate .h 文件:#import "MMDrawerController .h" @property (strong, nonatomic) MMDrawer ...
- yii使用MongoDB作为数据库服务软件[win7环境下](2)
11.测试php连接并对mongodb进行简单的操作,下载RockMongo对应的数据库管理软件放到webserver软件相关的目录下,例如: 12.打开对应的url[你还可以接着对数据库进行相应的操 ...