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

最近适当复习了下基本的排序算法,虽然做题的时候一般都直接用sort了事,但基本的排序原理还是要了解的,所以把常见的排序又重新写了下。

基本的插入、选择、冒泡就不说了,归并排序、快速排序可以网上搜算法导论的学习,也很简单。

1.插入排序

void insertSort(int a[],int len){
for(int i=;i<len;i++){
int tmp=a[i];
int j=i-;
while(j>= && tmp<a[j]){
a[j+]=a[j];
j--;
}
a[j+]=tmp;
}
}

2.选择排序

void selectSort(int a[],int len){
for(int i=;i<len-;i++){
int minidx=i;
for(int j=i+;j<len;j++){
if(a[j]<a[minidx]){
minidx=j;
}
}
if(a[i]>a[minidx]){
int tmp=a[i];
a[i]=a[minidx];
a[minidx]=tmp;
}
}
}

3.冒泡排序

void bubbleSort(int a[],int len){
int tmp;
for(int i=;i<len-;i++){
bool flag=true;
for(int j=;j<len-i-;j++){
if(a[j]>a[j+]){
tmp=a[j+];
a[j+]=a[j];
a[j]=tmp;
flag=false;
}
}
if(flag)
break;
}
}

4.归并排序O(NlgN)

#define INF 0x3f3f3f3f
/*
将[l,mid]和[mid+1,r]两个区间进行合并,每次取两个开头最小的那个
*/
void merges(int a[],int l,int mid,int r){
int len1=mid-l+;
int len2=r-mid;
int L[len1+],R[len2+];
for(int i=;i<len1;i++)
L[i]=a[l+i];
for(int i=;i<len2;i++)
R[i]=a[mid++i];
L[len1]=INF;
R[len2]=INF;
int left=,right=;
for(int k=l;k<=r;k++){
if(L[left]<=R[right]){
a[k]=L[left];
left++;
}
else{
a[k]=R[right];
right++;
}
}
}
//对区间[l,r]进行归并排序
void mergeSort(int a[],int l,int r){
if(l<r){
int mid=(r+l)/;
mergeSort(a,l,mid);
mergeSort(a,mid+,r);
merges(a,l,mid,r);
}
}

5.快速排序O(NlgN)

/*
以最后a[r]为划分点,将数组a划分成两个部分
前部分<=a[r],后部分>a[r]
最后返回a[r]的索引
*/
int quick_partition(int a[],int l,int r){
int x=a[r];
int i=l-;
for(int j=l;j<r;j++){
if(a[j]<=x){
i++;
swap(a[i],a[j]);
}
}
swap(a[i+],a[r]);
return i+; }
void quickSort(int a[],int l,int r){
if(l<r){
int mid=quick_partition(a,l,r);
quickSort(a,l,mid-);
quickSort(a,mid+,r);
}
}

6.最大堆排序O(NlgN)

//----------------堆排序O(NlgN)最大堆的实现--------------------------
/*
将最大堆的根节点和末尾交换后,可能破坏了最大堆的性质,所以要进行更新
*/
void heap_update(int a[],int i,int heap_size){
int l=i*+;
int r=i*+;
int large=i;
if(l<heap_size && a[l]>a[large])
large=l;
if(r<heap_size && a[r]>a[large])
large=r;
if(large!=i){
swap(a[i],a[large]);
heap_update(a,large,heap_size);
}
}
/*
将val插入到数组a的末尾,并进行最大堆的维护
*/
void heap_insert(int a[],int val,int heap_size){
heap_size++;
a[heap_size-]=val;
int idx=heap_size-;
while(idx> && a[idx/]<a[idx]){
swap(a[idx/],a[idx]);
idx=idx>>;
}
}
void heapSort(int a[],int len){
//构建最大堆
for(int i=;i<len;i++)
heap_insert(a,a[i],i);
for(int i=len-;i>=;i--){
swap(a[],a[i]);
heap_update(a,,i); //每次heap_size减小1的
}
}

7.希尔排序

最近突然遇到希尔排序,之前没听过,所以就了解一下,不专门写介绍了,给一篇链接吧,讲得挺详细的

https://www.cnblogs.com/chengxiao/p/6104371.html

希尔排序对于增量序列(即gap)的选择很重要,会影响到排序的性能,通常都采用gap=length/2。

希尔排序是可以突破O(N^2)的,但gap/=2的情况下最坏时间复杂度依然为O(N^2),一些优化过后的序列最坏情况可以到O(N^3/2)。

/*
https://www.cnblogs.com/chengxiao/p/6104371.html
希尔排序
*/
void shellsort(int a[],int len){
//划分成gap个组
for(int gap=len/;gap>;gap/=){
//从第gap个元素,逐个对其所在组进行插入排序操作
//而不需要for每个组进行操作
for(int i=gap;i<len;i++){
int j=i-gap;
//插入排序采用交换法即可
while(j>= && a[j]>a[j+gap]){
swap(a[j],a[j+gap]);
j-=gap;
}
}
/*
printf("gap:%d\n",gap);
for(int i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
*/
}
}

完整的测试代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cstdlib>
#include <ctime>
using namespace std;
//----------------插入排序--------------------------
void insertSort(int a[],int len){
for(int i=;i<len;i++){
int tmp=a[i];
int j=i-;
while(j>= && tmp<a[j]){
a[j+]=a[j];
j--;
}
a[j+]=tmp;
}
}
//----------------选择排序--------------------------
void selectSort(int a[],int len){
for(int i=;i<len-;i++){
int minidx=i;
for(int j=i+;j<len;j++){
if(a[j]<a[minidx]){
minidx=j;
}
}
if(a[i]>a[minidx]){
int tmp=a[i];
a[i]=a[minidx];
a[minidx]=tmp;
}
}
}
//----------------冒泡排序--------------------------
void bubbleSort(int a[],int len){
int tmp;
for(int i=;i<len-;i++){
bool flag=true;
for(int j=;j<len-i-;j++){
if(a[j]>a[j+]){
tmp=a[j+];
a[j+]=a[j];
a[j]=tmp;
flag=false;
}
}
if(flag)
break;
}
}
//----------------归并排序O(NlgN)--------------------------
#define INF 0x3f3f3f3f
/*
将[l,mid]和[mid+1,r]两个区间进行合并,每次取两个开头最小的那个
*/
void merges(int a[],int l,int mid,int r){
int len1=mid-l+;
int len2=r-mid;
int L[len1+],R[len2+];
for(int i=;i<len1;i++)
L[i]=a[l+i];
for(int i=;i<len2;i++)
R[i]=a[mid++i];
L[len1]=INF;
R[len2]=INF;
int left=,right=;
for(int k=l;k<=r;k++){
if(L[left]<=R[right]){
a[k]=L[left];
left++;
}
else{
a[k]=R[right];
right++;
}
}
}
//对区间[l,r]进行归并排序
void mergeSort(int a[],int l,int r){
if(l<r){
int mid=(r+l)/;
mergeSort(a,l,mid);
mergeSort(a,mid+,r);
merges(a,l,mid,r);
}
}
//----------------快速排序O(NlgN)--------------------------
/*
以最后a[r]为划分点,将数组a划分成两个部分
前部分<=a[r],后部分>a[r]
最后返回a[r]的索引
*/
int quick_partition(int a[],int l,int r){
int x=a[r];
int i=l-;
for(int j=l;j<r;j++){
if(a[j]<=x){
i++;
swap(a[i],a[j]);
}
}
swap(a[i+],a[r]);
return i+; }
void quickSort(int a[],int l,int r){
if(l<r){
int mid=quick_partition(a,l,r);
quickSort(a,l,mid-);
quickSort(a,mid+,r);
}
} int main()
{
int num=;
int a[num];
srand((unsigned)time(NULL));
for(int i=;i<num;i++){
a[i]=rand()%;
printf("%d ",a[i]);
}
printf("\n");
quickSort(a,,num-);
for(int i=;i<num;i++){
printf("%d ",a[i]);
}
return ;
}

最后,当然排序最省力的就是C++中的自定义排序了,直接用algorithm中的sort即可。

#include <algorithm>
bool cmp(int a,int b){
return a>b;
} sort(a,a+n); //a为数组,n为数组的长度,默认是从小到大排序
sort(a,a+n,cmp);//cmp即为自定义比较函数,此处是从大到小排序。

基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)的更多相关文章

  1. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. js算法初窥01(排序算法01-冒泡、选择、插入)

    排序,我想大家一定经历过或者正在经历着.或许你不懂算法,对排序算法一无所知,但是你一定用过一些第三方库的api来一键排序,那么,在你享受便捷的同时,你是否想过它的底层是如何实现的?这样的算法实现方式是 ...

  3. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  4. 排序算法之直接插入排序Java实现

    排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序: ...

  5. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

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

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

  8. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  9. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

随机推荐

  1. MySQL 聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  2. emacs org-mode文件转html文件

    Table of Contents 1. 发布站点 by emacs org-mode 1.1 org-mode 自带的导出方法 1.2 批量导出 1.3 css 美化 1.4 导出html 1. 发 ...

  3. 17秋 软件工程 团队第五次作业 Alpha Scrum1

    题目:团队作业--Alpha冲刺 17秋 软件工程 团队第五次作业 Alpha Scrum1 各个成员在 Alpha 阶段认领的任务 伟航:督促和监督团队进度,协调组内合作 港晨:APP前端页面编写: ...

  4. 网页中的meta标签的作用

    偶尔看到一篇博客详细介绍了meta的作用:http://www.cnblogs.com/nianshi/archive/2009/01/14/1375639.html

  5. CSS3 animation动画,循环间的延时执行时间

    如下代码,其中的delay值为3s,但是animation按现在的规则,这个delay是指动画开始前的延时,在动画循环执行间,这个delay是不生效的. .item{ webkit-animation ...

  6. CPU的内部架构和工作原理-原文

    CPU从逻辑上可以划分成3个模块,分别是.和,这三部分由CPU内部总线连接起来.如下所示: 控制单元:控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register). ...

  7. 用OpenSCAD設計特製的遊戲骰子

    一開始先製作一個簡單的立方體.定義一個變量「cube_size」,然後使用下圖的立方體程式.center=true的設定可讓立方體位於起始模型的正中央. 為你在OpenSCAD創造的物體加上不同顏色是 ...

  8. day14 Python集合

    定义:由不同元素组成的集合,集合是一组无序排列的可hash值,可以作为字典的key 1.不同元素.2.无序.3.集合中元素必须是不可变类型(数字,字符串,元祖) 特性:集合的目的是将不同的值存放在一起 ...

  9. Spring定时任务使用和如何使用邮件监控服务器

    Spring相关的依赖导入进去,即可使用spring的定时任务! <!-- spring核心包 --> <dependency> <groupId>org.spri ...

  10. MongoDB数据库中查询数据(下)

    MongoDB数据库中查询数据(下) 在find中,options参数值为一个对象,用来设置查询数据时使用的选项,下面我们来对该参数值对象中可以使用的属性进行介绍: 1. fields; 该属性值为一 ...