摘要

排序操作在程序设计中是非常基础和常见的,也是算法的基础部分,我对几种常见的比较排序算法进行了整理。

选择排序

思想:遍历数组,每次遍历都在未排序的部分找到最小元素的下标,在此次遍历结束后将最小元素放到遍历开始的位置。

性能:时间复杂度为O(n2),算法比较次数与初始序列状态无关,性能在所有排序算法中最差。

void Violence_Sort(int* A, int len){
for(int i=;i<len;i++)
{
int k = i;
for(int j=i;j<len;j++)
if(A[j]<A[k])
k = j;
if(k != i){
int t = A[i];
A[i] = A[k];
A[k] = t;
}
}
}

插入排序(insert sort)

思想: 将当前元素与它前面已排好序的元素依次进行比较,最后放置在合适的位置,初始时可从第二个元素开始,认为第一个元素已排好序。

性能:算法时间复杂度为O(n2),在序列规模较小时,性能比较好,且元素比较次数与初始序列杂乱程度相关,最优复杂度为O(n)。

void Insert_Sort(int* A, int len){
for(int i=;i<len;i++)
{
int key = A[i];
int j = i - ;
while(j >= && key < A[j]){
A[j+] = A[j];
j--;
}
A[j+] = key;
}
}

希尔排序(shell sort)

思想:利用插入排序的思想,考虑到插入排序在序列基本有序且数量较少时性能较高,因此先对序列进行逻辑上的分组然后插入排序,如:设定初始增量为x,则0,0+x,0+x+x ...为一组,1,1+x,1+x+x ...为第二组,共有x组,分别进行排序。那个随后减少增量,增加分组,直到增量为1。

性能:算法时间复杂度为O(n1.3) -O(n2),性能取决于增量序列。

void shellSort(int A[], int len){
for(int gap = len/; gap > ; gap /= ){
for(int i = gap; i < len; i++){
int key = A[i];
int j;
for(j = i-gap; j>= && A[j] > key; j-= gap)
A[j+gap] = A[j];
A[j+gap] = key;
}
}
}

冒泡排序(bubble sort)

思想:从左往右遍历,比较相邻两个元素的大小,将大的一个放在后面,每遍历一趟,可找到一个最大值放置在最后,经过n-1趟遍历即可。

性能:时间复杂度为O(n2),元素比较次数与初始状态无关,性能略低于插入排序。

void Bubble_Sort(int* A,int len){
for(int i=;i<len;i++)
for(int j=;j<len-i;j++)
{
if(A[j]>A[j+]){
int t = A[j+];
A[j+] = A[j];
A[j] = t;
}
}
}

归并排序(merge sort)

思想:使用分治思想,将原始序列分为两部分分别排序,然后合并,重点在于合并过程。

性能:时间复杂度为O(nlgn),不过合并过程会使用额外的存储空间,占用内存。

void Merge(int A[], int low, int mid, int high){
int cp[high-low+];
for(int i = low; i <= high; i++)
cp[i-low] = A[i];
int l = low, r = mid+;
for(int i = low; i <= high; i++){
if(l > mid) {A[i] = cp[r - low]; r++;}
else if(r > high) {A[i] = cp[l - low]; l++;}
else if(cp[l-low] <= cp[r-low]) {A[i] = cp[l -low]; l++;}
else {A[i] = cp[r -low]; r++;}
}
} void Merge_Sort(int A[], int low, int high){
if(high > low){
int mid = (low+high)/;
Merge_Sort(A, low, mid);
Merge_Sort(A, mid+, high);
Merge(A, low, mid, high);
}
}

快速排序(quick sort)

思想:与归并排序类似,也使用分治思想,选择一个元素值(一般选择最后一个元素),将比它小的放在左边部分,比它大的放在右边,然后对两部分分别进行上述操作知道递归结束,关键步骤在于元素的分类,且只占用O(1)的额外存储空间。

性能:时间复杂度为O(nlgn),与归并排序不同,该算法占用常数级额外存储,在大规模序列排序应用中性能较好。

int patition(int* p, int left, int right){
int key = p[left];
while(left < right){
while(left<right && key <= p[right]) right--;
if(left<right) p[left++] = p[right];
while(left<right && key >= p[left]) left++;
if(left<right) p[right--] = p[left];
}
p[left] = key;
return left;
} void quick_sort(int* p, int left, int right){
if(left >= right) return;
int mid = patition(p, left, right);
quick_sort(p, left, mid-);
quick_sort(p, mid+, right);
}

堆排序(heap sort)

思想:使用堆数据结构进行排序,堆是一种用数组存储的二叉树,根据父节点和子节点的大小关系分为最大堆和最小堆,这里使用最大堆进行排序。

性能:时间复杂度为O(nlgn),在实际使用中,堆排序的排序性能通常逊与快速排序。

void Max_Heapify(int* A, int i,int size){
int l = *i;
int r = *i + ;
int large = i;
if(l <= size && A[l] > A[i])
large = l;
else
large = i;
if(r <= size && A[r] > A[large])
large = r;
if(large != i){
int t = A[large];
A[large] = A[i];
A[i] = t;
Max_Heapify(A, large, size);
}
} void Build_Max_Heap(int* A, int size){
for(int i=size/;i>;i--)
Max_Heapify(A,i,size);
} void Heap_Sort(int* A, int len){
Build_Max_Heap(A, len);
while(len-){
int t = A[];
A[] = A[i];
A[i] = t;
len--;
Max_Heapify(A,,len);
}
}

  

排序算法合集(C++实现)的更多相关文章

  1. 排序算法合集(Java)

    整理了一下常用的排序算法,算法过程和示意图不详细讲,百度很多,只列代码,如有错误,还望大家指出. 1.冒泡排序 public static void bubbleSort(int[] a){ for( ...

  2. 排序算法合集 python

    直接选择.插入排序 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的 ...

  3. [算法整理]树上求LCA算法合集

    1#树上倍增 以前写的博客:http://www.cnblogs.com/yyf0309/p/5972701.html 预处理时间复杂度O(nlog2n),查询O(log2n),也不算难写. 2#st ...

  4. 常见算法合集[java源码+持续更新中...]

    一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...

  5. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  6. 最优路径算法合集(附python源码)(原创)

    主要的最优(最短)路径算法: 一.深度优先算法:二.广度优先算法:三.Dijstra最短路径:四.floyd最短路径(待): 一.深度优先算法 图的深度优先搜索(Depth First Search) ...

  7. 【Java】 大话数据结构(14) 排序算法(1) (冒泡排序及其优化)

    本文根据<大话数据结构>一书,实现了Java版的冒泡排序. 更多:数据结构与算法合集 基本概念 基本思想:将相邻的元素两两比较,根据大小关系交换位置,直到完成排序. 对n个数组成的无序数列 ...

  8. 【Java】 大话数据结构(15) 排序算法(2) (快速排序及其优化)

    本文根据<大话数据结构>一书,实现了Java版的快速排序. 更多:数据结构与算法合集 基本概念 基本思想:在每轮排序中,选取一个基准元素,其他元素中比基准元素小的排到数列的一边,大的排到数 ...

  9. 【Java】 大话数据结构(16) 排序算法(3) (堆排序)

    本文根据<大话数据结构>一书,实现了Java版的堆排序. 更多:数据结构与算法合集 基本概念 堆排序种的堆指的是数据结构中的堆,而不是内存模型中的堆. 堆:可以看成一棵完全二叉树,每个结点 ...

随机推荐

  1. 【BigData】Java基础_Eclipse配置自动补全new

    需求描述 在使用Eclipse的时候,每次new一个对象,写起来比较麻烦,以下是配置Eclipse,然后使用快捷键补全new方法的步骤,此配置使用官方属于叫做:配置自动分配局部变量 配置步骤 打开Wi ...

  2. Spring 事物隔离级别,事物传播行为

    Spring 框架中对于事物的管理,主要定义了一下四种属性: 事物的隔离(Isolation)级别 事物的传播行为(Propagation Behavior) 事物的超时时间(TImeout) 是否为 ...

  3. docker 镜像加速,修改为阿里云镜像

    首先访问 登录阿里云 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,会获取专属的镜像地址 centos用户执行下列操作即可 s ...

  4. Solr7.x学习(4)-导入数据

    导入配置可参考官网:http://lucene.apache.org/solr/guide,http://lucene.apache.org/solr/guide/7_7/ 1.数据准备(MySQL8 ...

  5. 【2019年05月20日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年05月20日 之间,滚动市盈率历史新低排名. 上市三年以上的公司, 2019年05月20日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历 ...

  6. Shell脚本之七 选择、循环结构

    一.if else if 语法格式 if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if [ $(ps -e ...

  7. 关于Class: ES6 JavaScript的class的静态方法、属性和实例属性。

    1.什么叫做静态方法? 1.1.类相当于实例的原型, 所有在类中定义的方法, 都会被实例继承.如果在一个方法前,加上Static关键字,就表示该方法不会被继承,而是直接通过类来调用,这被称为 “静态方 ...

  8. 由浅入深了解NB-IoT | 我的物联网成长记

    [摘要] 什么是NB-IoT?NB-IoT有什么优势?NB-IoT能做什么?本文将会从NB-IoT技术的发展历程,技术特点,通信协议,应用场景等方面为您全方面解读NB-IoT技术,了解NB-IoT的独 ...

  9. 前端与算法 leetcode 125. 验证回文串

    目录 # 前端与算法 leetcode 125. 验证回文串 题目描述 概要 提示 解析 解法一:api侠 解法二:双指针 算法 传入测试用例的运行结果 执行结果 GitHub仓库 查看更多 # 前端 ...

  10. 前端与算法 leetcode 344. 反转字符串

    目录 # 前端与算法 leetcode 344. 反转字符串 题目描述 概要 提示 解析 解法一:双指针 解法二:递归 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 lee ...