快速排序 && 希尔排序 && 插入排序
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, ...
随机推荐
- Solr整合中文分词组件IKAnalyzer
我用的Solr是4.10版本, 在csdn下载这个版本的IKAnalyzer:IK Analyzer 2012FF_hf1.zip 解压后目录如下: (1)这里还用solr自带的example实验分词 ...
- iOS 7 UITableview 在Plain模式下 设置背景颜色无效
在iOS6的时候,设置Plain模式下table的颜色 通过[self.table setBackgroundColor:[UIColor red]]; 就可以看到一个满身通红的tableView 但 ...
- QT中QWS的含义 (转至 宋金时的专栏
QT 编程和文档中的术语QWS的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS ...
- 不让padding影响元素的宽度
CSS3 新增了 box-sizing 属性. 以前,如果指定 div 的宽度为 div { width: 100px; height: 100px; padding: 10px; } 则包含 pad ...
- firefox 不识别background-position-y / background-position-x
火狐不识别background-position-y 或background-position-x; 案例: 页面: 背景图: 一列按钮,点击时让当前背景图的background-position-y ...
- 腾讯优测-优社区干货精选 | 那些年,我们在Android机型适配上遇到的坑之Camera拍照时快门咔嚓声
文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...
- charles 结合mocky 模拟数据
重定向(模拟造数据) 例如:E代送商户端订单列表,模拟99+订单 接口:http://api.edaisong.com/20151022/order/consigneeaddressb 打开http: ...
- POJ 1006 中国剩余定理
#include <cstdio> int main() { // freopen("in.txt","r",stdin); ; while(sca ...
- noip2013 火柴排序
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 ai 表示第一列火柴中第 i 个火柴的高度,b ...
- SQLite语句练习题
1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...