稳定不稳定看相等元素排序前和排序后的相对顺序是否改变。

O(n2)

直接选择(不稳定):选择出最小的放在第一位;选择出次小的放在第二位;......

代码:

#include <iostream>
using namespace std;
//直接选择排序算法描述:
/*
1、第一层遍历:以未排序的第一个元素作为最小值
2、第二层遍历:对剩下的未排序元素进行遍历,小于最小值则交换值
3、得到最小的元素组成排序序列,以此类推,第二小的元素也会排入到排序好的序列中。
4、重复直至排序完全
*/    //==》O(n^2)
void Swap08(int a[], int i,int j)
{int tmp;tmp=a[i];a[i]=a[j];a[j]=tmp;
}void SelectSeq(int a[],int num)
{int min=0;for(int i=0;i<num-1;i++)    //最后一个序列是单独的一个元素,不需要再排序
    {min=i;//1、选择未排序序列的第一个值为最小的值for(int j=i+1;j<num;j++)  //遍历其余未排序的值,如果小于最小值,则交换值
        {if(a[i]>a[j])Swap08(a,i,j);}}
}int main08()
{int a[]={12,8,20,5,9,16,7,30};int num=sizeof(a)/sizeof(a[0]);SelectSeq(a,num);for(int i=0;i<num;i++){cout<<a[i]<<" ";}return 0;
}

冒泡(稳定):两两比较,最大的放后边;直到最大的放在末尾。

代码:

#include <iostream>
using namespace std;
//冒泡排序算法描述:
/*
1、比较相邻元素,如果前一个比后一个大,则交换位置。
2、对每一对相邻的元素做同样的工作,从第一对到最后一对,做完一次循环后,最后元素则是最大的。
3、针对以上元素重复以上步骤,除了最后一个。
4、重复对越来越少的元素做以上动作,直至没有可交换的对。
*/    //==》O(n^2)
void Swap09(int a[], int i,int j)
{int tmp;tmp=a[i];a[i]=a[j];a[j]=tmp;
}void BubbleSeq(int a[],int len)
{for(int j=0;j<len-1;j++){for(int i=0;i<len-1-j;i++){if(a[i]>a[i+1])Swap09(a,i,i+1);}}return;
}int main09()
{int a[]={12,8,20,5,9,16,7,30};int len=sizeof(a)/sizeof(a[0]);BubbleSeq(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}return 0;
}

==》改进:鸡尾酒排序

代码:

#include <iostream>
using namespace std;
//鸡尾酒排序算法描述:
/*
1、设两个索引,一个索引第一位,一个索引最末尾。
2、单层循环,一遍最大冒泡,一次最小冒泡。
3、重复做以上动作,直到排序好。
*/    //==》O(n^2)void Swap11(int a[], int i,int j)
{int tmp;tmp=a[i];a[i]=a[j];a[j]=tmp;
}
void CocktailSeq(int a[],int len)
{int left=0;int right=len-1;while(left<right){for(int i=left;i<right;i++){if(a[i]>a[i+1])Swap11(a,i,i+1);}right--;for(int j=right;j>left;j--){if(a[j]<a[j-1])Swap11(a,j,j-1);}left++;}return;
}int main11()
{int a[]={12,8,20,5,9,16,7,30};int len=sizeof(a)/sizeof(a[0]);CocktailSeq(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}return 0;
}

直接插入(稳定):拿到一张新牌,从后往前看;大于新牌,则往后移一位;小于或等于,则将新牌插入到后一位;

#include <iostream>
using namespace std;
//直接插入排序算法描述:
/*
1、第一层循环:拿到元素。
2、第二层循环:从该元素的前一个位置开始,一直向前循环,若大于拿到的元素,则向后移一位;若小于该元素,则把该元素插入到后面一位的位置上
3、重复做以上动作,直至最后一个元素也插好了。
*/    //==》O(n^2)
void InsertSeq(int a[],int len)
{for(int i=0;i<len;i++){int tmp = a[i];int j=i-1;while(j>=0 && a[j] > tmp){a[j+1]=a[j];j--;}a[j+1]=tmp;}return;
}int main()
{int a[]={12,8,20,5,9,16,7,30};int len=sizeof(a)/sizeof(a[0]);InsertSeq(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}
}

==》改进1:二分插入排序(稳定)

代码:

#include <iostream>
using namespace std;
//直接插入排序的改进算法——二分查找定位插入算法描述:
/*
1、第一层循环:拿到元素。
2、二分法定位插入位置(插入改位置的后面)
3、把定位后右面的元素   从后往前    依次向后移动一位。
4、把拿到的元素插进去
*/    //==》O(n^2)
void DivInsertSeq(int a[],int len)
{for(int i=0;i<len;i++){int tmp = a[i];int left=0;int right=i-1;while(left<=right){int mid=(left+right)/2;if(a[mid]>tmp)right=mid-1;elseleft=mid+1;}for(int j=i-1;j>left;j--){a[j+1]=a[j];}a[left]=tmp;}return;
}int main()
{int a[]={12,8,20,5,9,16,7,30};int len=sizeof(a)/sizeof(a[0]);DivInsertSeq(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}return 0;
}

==》改进2:希尔排序(不稳定)

O(nlogn)

归并(稳定)

快排(不稳定)

堆排(不稳定)

转载于:https://www.cnblogs.com/westlife-11358/p/9318790.html

总容易混淆的排序算法:直接选择、冒泡(鸡尾酒)、直接插入(二分插入)(希尔)...相关推荐

  1. 排序算法整合(冒泡,快速,希尔,拓扑,归并)

    冒泡排序介绍 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序. 它是一种较简单的排序算法.它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小:如果前者比后 ...

  2. 冒泡和快速排序的时间复杂度_排序算法整合(冒泡,快速,希尔,拓扑,归并)

    本文链接:https://blog.csdn.net/onceing/article/details/99838520 冒泡排序介绍 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序. ...

  3. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  4. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  5. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

  6. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  7. JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)

    1. 冒泡 // 冒泡 - 每次循环, 将两两中偏大的元素移动到右边 for (let i = 0; i < arr.length - 1; i++) {for (let j = i; j &l ...

  8. 【排序算法】选择排序(Selection sort)

    选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...

  9. 排序算法(3)选择排序

    排序算法(3)选择排序 原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后 ...

  10. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

最新文章

  1. java 反射 速度_Java反射获取实例的速度对比分析
  2. UA MATH564 概率论III 期望
  3. Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文
  4. .Net Conf 2020 之回顾
  5. 非常详细Redis数据库入门教程
  6. h5页面保存img_如何设计H5编辑器中的模版库并实现自动生成封面图
  7. clickhouse分布式DDL查询
  8. C#结合VS开发WinForm学习笔记
  9. Code snippet of the day : Get Chinese Spell in C#
  10. 智慧园区大数据平台建设方案(ppt)
  11. 房地产数字化营销方案-蓝图
  12. 第1142期AI100_机器学习日报(2017-11-03)
  13. 用spring MVC 生成Excel和PDF
  14. [Android O] [RK3399] -- Vendor Storage 功能探究
  15. Acdream 1424 Diversion 树链剖分+线段树
  16. PDF编辑器:Adobe Acrobat XI Pro
  17. [Excel知识技能] 筛选功能
  18. X11 关闭屏幕保护
  19. 2 Linux内核目录概述
  20. type_traits 类型萃取

热门文章

  1. Java线程 生产者--消费者模式总结(一)
  2. ApacheCN 翻译活动进度公告 2019.3.3
  3. redis学习笔记1-NoSQL概述
  4. mysql如何用sql增加字段和注释?
  5. swift的if语句
  6. 深度剖析 C++ 对象池自动回收技术实现
  7. UIAutomator源码分析之启动和运行
  8. Linux下JDK和Tomcat安装
  9. 学技术的不能自废武功
  10. js基础-16-继承