前言:

    本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙。之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷。回想一下,先后也曾参加过ACM大大小小的校级赛、区域赛。没什么惊天动地的奖项,最好的名次也就省三等奖。现在作为第一篇算法总结就拿常见的排序算法以我个人的理解,以及代码实现跟大家简单分享一下(排序算法如果一一罗列的话,不下十种。曾在图书馆的旧书架上看过一本近900页的书,内容就是专门介绍排序算法)。

选择排序(select)

选择排序比较容易理解,每一次往后遍历都是为了寻找“最小值”的下标。N次遍历,时间复杂度为:O(n^2)

冒泡排序(bubble)

冒泡排序也比较形象,理解为大气泡不断下沉,小气泡往上冒。同样往后进行n次遍历,时间复杂度为:O(n^2)。跟选择排序的区别:选择排序属于稳定排序,从初始状态到排序完成过程中的每一次遍历各元素前后位置“相对稳定”。而且,冒泡排序每一轮遍历可能产生多次交换swap(),而选择排序固定每一轮的遍历都只进行一次交换swap()操作。

插入排序(insert)

插入排序可以理解为对扑克牌排序,原先拿到一手杂乱的牌,通过“插入”将所有牌排好序。

一般的插入排序时间复杂度同样是:O(n^2),进行具体样例测试时跟样例数据的初始顺序有关。

希尔排序(shell)

希尔排序为进化版的插入排序,只因为其基于插入排序的思想上,加入步长”step”。一般读者可能不知道希尔排序应用到大量数据的排序的高效,据研究的学者表明一般情况下希尔排序的排序时间复杂度降低为O(n^(3/2))

归并排序(merge)

归并排序是基于递归的思想进行的一种时间复杂度为:O(N*lgN)排序算法,不过其附加O(n)的空间辅助代价。理解好归并排序后可以将其递归思想扩展应用到数列逆序数的求解问题上,这里不再展开。

快速排序(quick)

快速排序有多种实现方式,同样是利用递归的思想,不断将问题划分为具有相同性质的子问题进行求解。实现快速排序算法的平均时间复杂度为:O(N*lgN);快排的O(N*lgN)算法同样通过拓展可以用于求无序数列的“第K大”元素。

堆排序(heap)

二叉堆,简称堆(heap)。一种非常奇妙的数据结构,是本人接触过的算法当中最惊叹的算法之一,仅仅利用数组就可以实现。在堆排序中,我们一般采用大根堆,时间复杂度O(N*lgN),排序效果较快排稳定,而且也不需要额外的空间存储代价。


代码实现部分(C/C++),本程序建议在codeblocks这款界面比较友好的IDE测试。

 /*
*排序算法汇总(C/C++实现)
*/
#include <cstdio>
#include <cstring>
//#define swap(x,y){x^=y;y^=x;x^=y;}
#define swap(x,y){int temp=x;x=y;y=temp;} const int N = ; void selectSort(int *a,int n){
for(int i=;i<n;i++){
int min=i;
for(int j=i+;j<n;j++){
if(a[j]<a[min]) min=j;
}
swap(a[i],a[min]);
}
}
//something error!
void bubbleSort(int *a,int n){
for(int i=;i<n;i++){
for(int j=i;j<n;j++)
if(a[j]<a[i]) swap(a[i],a[j]);
}
}
void insertSort(int *a,int n){
for(int i=;i<n;i++){
for(int j=i;j->=&&a[j]<a[j-];j--){
swap(a[j],a[j-]);
}
}
}
void shellSort(int *a,int n){
//设定划分步长step
int step=;
int h=;
while(h*step<n) h=h*step + ;
while(h>=){
for(int i=;i<n;i++){
for(int j=i;j-h>=&&a[j]<a[j-h];j-=h)
swap(a[j],a[j-h]);
}
h /= step;
}
}
void mergeSort(int *a,int p,int q,int *T){
//[p,q)左闭右开
if(p+>=q) return;
int m = p+(q-p)/;
//printf("m=%d\n",m);
mergeSort(a,p,m,T);
mergeSort(a,m,q,T);
for(int i=p,x=p,y=m;i<q;){
if( x<m && y<q && a[x]<a[y] || y>=q) T[i++]=a[x++];
else T[i++]=a[y++];
}
for(int i=p;i<q;i++)
a[i] = T[i];
}
void qSort(int *a,int p,int q){
if(p>=q) return ;
int i=p-;
for(int j=p;j<q;j++) if(a[j]<a[q]){
i=i+;
swap(a[i],a[j]);
}
i=i+;
swap(a[i],a[q]); qSort(a,p,i-);
qSort(a,i+,q);
} void sink(int *a,int n,int k){
while(*k<=n){
int j=*k;
if(j<n && a[j]<a[j+]) j++;
//if(a[j]<a[j+1]) j=j+1;
if(a[k] > a[j]) break;
swap(a[j],a[k]);
k = j;
}
}
void heapSort(int *a,int n){
for(int k=n/;k>=;k--)
sink(a,n,k);
for(;n>;){
swap(a[],a[n]);
n--;
sink(a,n,);
}
}
void pt(int *a,int s,int n){
for(int i=s;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main(){
//printf("Hello world!\n");
int a[N]={,,-,,,,,,-,};
int b[N+]={-,,,-,,,,,,-,};
int T[N];
int c;
printf("请选择一种排序算法:\n 1.选择排序\n 2.冒泡排序\n 3.插入排序\n 4.希尔排序\n 5.归并排序\n 6.快速排序\n 7.堆排序\n ----> ");
scanf("%d",&c);
switch(c){
case :
selectSort(a,N);
break;
case :
bubbleSort(a,N);
break;
case :
insertSort(a,N);
break;
case :
shellSort(a,N);
break;
case :
mergeSort(a,,N,T);
break;
case :
qSort(a,,N-);
break;
case :
heapSort(b,N);
break;
default:
printf("选择无效!");
return ;
}
printf("输出结果:\n");
if(c==)
pt(b,,N+);
else
pt(a,,N); return ;
}

测试演示:

    

结语:

    以上排序算法尚不能涵盖所有排序算法,比如基数排序,字符串排序等。本次排序算法分享内容就此打住,往后将持续更新。。。(因水平有限错漏在所难免,望各朋友不吝批评指正^_^)

排序算法汇总(C/C++实现)的更多相关文章

  1. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  2. Java常用的7大排序算法汇总

    1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...

  3. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  4. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  5. 排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  6. C#实现所有经典排序算法汇总

    C#实现所有经典排序算法1.选择排序 class SelectionSorter { private int min; public void Sort(int[] arr) { ; i < a ...

  7. 面试必备:排序算法汇总(c++实现)

    排序算法主要考点: 7种排序 冒泡排序.选择排序.插入排序.shell排序.堆排序.快速排序.归并排序 以上排序算法是面试官经常会问到的算法,至于其他排序比如基数排序等等,这里不列举. 以下算法通过c ...

  8. C#所有经典排序算法汇总

    1.选择排序 选择排序 class SelectionSorter     {         private int min;         public void Sort(int[] arr) ...

  9. Java 中常见的各种排序算法汇总

    首先,Java中自已是有排序的 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是 ...

随机推荐

  1. SSH远程会话管理工具 - screen使用教程

    一.screen命令是什么? Screen是一个可以在多个进程之间多路复用一个物理终端的全屏窗口管理器.Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个s ...

  2. Easyui dialog中嵌入iframe

    如果easyui dialog的地址属性用href超链接,easyui 不会加载整个url页面,只会截取url目标页的body体间的html, 如果想加载把其他页面 加载进dialog的iframe中 ...

  3. 10分钟写一个markdown编辑器

    marked.js Marked是一个Markdown解析引擎. vue.js Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vu ...

  4. javascript实现键盘自动打字效果

    最近在网上看到一个字符逐个出现的打字效果,觉得挺有趣的,想一想基本实现思路就是设置一个定时器逐然后逐个向容器中添加字符,于是就基于jQuery写了一个简单版的. <!DOCTYPE html&g ...

  5. nodejs微信公众号快速开发|自定义关键字回复

    一点说明: nodejs 微信api 扩展,集成大部分功能. 案例 https://github.com/leiroc/node-wxeasy-example 上传example中文件到服务器 ,然后 ...

  6. px-rem 一个将px转换为rem的工具

    将px转换为rem的工具,github地址:https://github.com/finance-sh/px-rem 怎样转换静态文件 安装: npm install px-rem -g 然后跑下命令 ...

  7. 微软要如何击败Salesforce?Office365、Azure、Dynamics365 全面布局AI | 双语

    微软在上月宣布组建自己的 AI 研究小组.该小组汇集了超过 5000 名计算机科学家和工程师,加上微软内部研究部门,将共同挖掘 AI 技术. 与此同时,亚马逊,Facebook,Google,IBM ...

  8. iOS从零开始学习直播之音频1.播放本地音频文件

      现在直播越来越火,俨然已经成为了下一个红海.作为一个资深码农(我只喜欢这样称呼自己,不喜欢别人这样称呼我),我必须赶上时代的潮流,开始研究视频直播.发现视屏直播类的文章上来就讲拉流.推流.采集.美 ...

  9. iOS---The maximum number of apps for free development profiles has been reached.

    真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...

  10. Spring下如何配置bean

    本次讲述项目背景: 创建Service类,Service下用到dao类.通过在Spring中配置bean,实现在项目启动时,自动加载这个类 本次只讲述配置bean的注意事项,故只给出简单实例: 创建S ...