三种最简单的排序算法(直接插入排序、冒泡排序、简单选择排序)
来源:互联网 发布:单片机中断编写歌曲 编辑:程序博客网 时间:2024/05/22 06:39
一、直接插入排序(稳定)
直接插入排序是最简单的排序方法之一,其基本思想是每次从无序表中取出一个元素,把它插入到有序表的合适位置,使有序表依然有序。直接插入排序是由两层嵌套循环组成的,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置,其算法时间复杂度为O(N*N),空间复杂度为O(1)。
void insertSort(int a[], int len) //本文默认排序为从小到大排序{ int i,j,temp; for (i = 1; i < len; i++) //外层循环标识待排序的数值 { temp = a[i]; //保存第i个需要插入的数值 for(j = i - 1; j >= 0 && a[j] > temp; j--) //内层循环决定插入的位置(这个位置一定在0到i-1之间) a[j+1] = a[j]; //元素后移以提供插入空间 a[j+1] = temp; //查找到位置之后插入数据 } }
二、冒泡排序(稳定)
冒泡排序同样是最简单的排序方法之一,并且常被用来寻找数组中最值。冒泡排序算法运作如下:1、比较相邻的元素,如果第一个比第二个大,就交换他们两个;2、对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。一次遍历之后,最后的元素应该会是最大的数;3、针对所有元素重复以上的步骤,除了最后一个;4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。该算法的时间复杂度为O(N*N),空间复杂度为O(1)。
void swap(int & a, int & b) //交换两个数比较好的一种方式,可免疫越界问题{ a = a ^ b; b = a ^ b; a = a ^ b; } void bubbleSort(int arr[], int len) { int i,j,exchange; exchange = 0; //标记 for (i = 0; i < len - 1; i++) { for (j = 0; j < len - i - 1; j++) //随着趟数的增加,需要比较的次数越来越少 { if (arr[j] > arr[j+1]) { swap(arr[j],arr[j+1]); exchange = 1; } } //如果没交换元素,说明已排好序 if (!exchange) { break; } } }
三、简单选择排序(不稳定)
简单选择排序的思路很简单,将最小元素找出并放在序列的最前面,在剩下的元素中继续找出最小的元素放在第二个位置上,依次类推,每次选出一个元素即可确定其在有序序列中的最终位置,简单选择排序的时间复杂度为O(N*N),空间复杂度为O(1)。
void selectSort(int arr[], int len) { int i,j,temp; for (i = 0; i < len - 1; i++) { temp = i; //记录最小元素的位置 for (j = i + 1; j < len; j++) //每一趟在后面的n-i+1个待排序的元素中选择关键字最小的元素 { if (arr[j] < arr[temp]) { temp = j; } } if (temp != i) //temp=i则表示已经在最终位置上,不需交换 { swap(arr[temp],arr[i]); //参考冒泡排序中的交换算法 } } }
最后对排序算法的稳定性予以总结:若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。
要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。
- 三种最简单的排序算法(直接插入排序、冒泡排序、简单选择排序)
- 简单排序:冒泡排序、直接插入排序、直接选择排序
- 简单排序---冒泡,简单选择,直接插入
- 常用的排序算法:冒泡,简单选择,直接插入,快速排序,堆排序
- 简单排序算法:冒泡排序,选择排序,插入排序
- 简单排序算法(冒泡排序、选择排序、插入排序)
- 常用内部排序算法之四:简单选择排序、直接插入排序和冒泡排序
- 简单排序算法之选择排序、直接插入排序和冒泡排序
- 几种内部排序算法总结!(冒泡排序、快速排序、直接插入排序、拆半插入排序、简单选择排序)
- 几种内部排序算法总结!(冒泡排序、快速排序、直接插入排序、拆半插入排序、简单选择排序)
- 排序学习(直接插入排序,折半插入排序,冒泡排序,快速排序,简单选择排序)
- 直接插入、简单选择、冒泡排序
- 简单排序(冒泡,选择,直接插入)
- 直接插入、冒泡、快速、简单选择、堆、归并排序算法
- 直接插入、冒泡、快速、简单选择、堆、归并排序算法
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
- Java简单算法之 冒泡排序 选择排序 插入排序
- Technique与Technology的区别
- hdu1561之树形dp
- SpringMVC+MyBatis 整合遇到错误 Configuration problem: Unable to locate Spring NamespaceHandler for XML
- 必须成功,别无选择-最贫穷的哈弗女孩
- Dungeon Master UVA532
- 三种最简单的排序算法(直接插入排序、冒泡排序、简单选择排序)
- 【targeting学习笔记】Display Advertising Targeting
- spring applicationcontext.xml dependency-check取值问题
- 转:周宏桥“如果一生只读10本书”和“从工程技术向市场商业转型”的推荐书目
- 为QScintilla2编写词法分析器
- Associate Principal Research Scientist - 2013/10/29
- Unity在一个场景中使用其他场景烘焙的物体
- 判断中文是否属于回文
- Domino 迁移到Exchange 之 Domino Admin 安装!