总容易混淆的排序算法:直接选择、冒泡(鸡尾酒)、直接插入(二分插入)(希尔)...
稳定不稳定看相等元素排序前和排序后的相对顺序是否改变。
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
总容易混淆的排序算法:直接选择、冒泡(鸡尾酒)、直接插入(二分插入)(希尔)...相关推荐
- 排序算法整合(冒泡,快速,希尔,拓扑,归并)
冒泡排序介绍 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序. 它是一种较简单的排序算法.它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小:如果前者比后 ...
- 冒泡和快速排序的时间复杂度_排序算法整合(冒泡,快速,希尔,拓扑,归并)
本文链接:https://blog.csdn.net/onceing/article/details/99838520 冒泡排序介绍 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序. ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析
排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...
- 堆排序算法c语言筛选法,【排序】排序算法之选择排序
排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...
- JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)
1. 冒泡 // 冒泡 - 每次循环, 将两两中偏大的元素移动到右边 for (let i = 0; i < arr.length - 1; i++) {for (let j = i; j &l ...
- 【排序算法】选择排序(Selection sort)
选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...
- 排序算法(3)选择排序
排序算法(3)选择排序 原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后 ...
- Java经典排序算法:选择排序,动图演示排序过程
Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...
最新文章
- java 反射 速度_Java反射获取实例的速度对比分析
- UA MATH564 概率论III 期望
- Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文
- .Net Conf 2020 之回顾
- 非常详细Redis数据库入门教程
- h5页面保存img_如何设计H5编辑器中的模版库并实现自动生成封面图
- clickhouse分布式DDL查询
- C#结合VS开发WinForm学习笔记
- Code snippet of the day : Get Chinese Spell in C#
- 智慧园区大数据平台建设方案(ppt)
- 房地产数字化营销方案-蓝图
- 第1142期AI100_机器学习日报(2017-11-03)
- 用spring MVC 生成Excel和PDF
- [Android O] [RK3399] -- Vendor Storage 功能探究
- Acdream 1424 Diversion 树链剖分+线段树
- PDF编辑器:Adobe Acrobat XI Pro
- [Excel知识技能] 筛选功能
- X11 关闭屏幕保护
- 2 Linux内核目录概述
- type_traits 类型萃取