插入排序

排序算法之二分法(折半)插入排序算法

安稳与你 提交于 2020-03-06 21:45:58
基本思想 折半插入排序的基本思想与直接插入排序一样,在插入第 i ( i ≥ 1 ) 个元素时,前面 i − 1 个元素已经排好序。差别在于寻找插入位置的方法不同。折半插入排序是採用折半查找法来寻找插入位置的。 折半查找法的基本思路是:用待插元素的值与当前查找序列的中间元素的值进行比較,以当前查找序列的中间元素为分界,确定待插元素是在当前查找序列的左边还是右边,假设是在其左边。则以该左边序列为当前查找序列。右边也相似。依照上述方法,递归地处理新序列。直到当前查找序列的长度小于1时查找过程结束。 代码 //待排数据存储在数组a中。以及待排序列的左右边界 public void BinaryInsertSort(int[] a, int left, int right) { int low, middle, high; int temp; for (int i = left + 1; i <= right; i++) { temp = a[i]; low = left; high = i - 1; while (low <= high) { middle = (low + high) / 2; if (a[i] < a[middle]) high = middle - 1; else low = middle + 1; } for (int j = i - 1; j >= low; j

排序—二分法插入排序

会有一股神秘感。 提交于 2020-03-06 21:41:41
思路和插入排序一样,可见: http://www.cnblogs.com/PerkinsZhu/p/5664808.html 不同点: 在寻找插入位置的时候采用二分法定位。二分法怎么定位?…… 运行结果: 原数组: 21、8、2、18、0、9、27、12、5、24、 第0次循环排序结果: 8、21、2、18、0、9、27、12、5、24、 第1次循环排序结果: 2、8、21、18、0、9、27、12、5、24、 第2次循环排序结果: 2、8、18、21、0、9、27、12、5、24、 第3次循环排序结果: 0、2、8、18、21、9、27、12、5、24、 第4次循环排序结果: 0、2、8、9、18、21、27、12、5、24、 第5次循环排序结果: 0、2、8、9、18、21、27、12、5、24、 第6次循环排序结果: 0、2、8、9、12、18、21、27、5、24、 第7次循环排序结果: 0、2、5、8、9、12、18、21、27、24、 第8次循环排序结果: 0、2、5、8、9、12、18、21、24、27、 直接看代码吧: public void binaryInsertionSort(int[] array) { printArray("原数组:", array); for (int i = 1; i < array.length; i++) { int temp =

插入排序

谁说我不能喝 提交于 2020-03-05 22:44:21
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>插入排序</title> </head> <body> </body> <script> function insertion_sort(A) { for (let i = 1; i < A.length; i++) { insert(A, i, A[i]) } } function insert(A, i, x) { let p = i - 1; while (p >= 0 && A[p] > x) { A[p + 1] = A[p] p-- } A[p + 1] = x } const A = [5, 8, 1, 3, 2, 4, 9] insertion_sort(A) console.log(A) </script> </html> 过程如下: 【5, 8, 1, 3, 2, 4, 9】 第一次循环: i=1;x=8; insert 方法里面: p = 0;A[1] = 8 不符合跳出循环 A【0】= 5 结果: [5,8,1,3,2,4,9] 第二次循环: i=2;x=1 insert 方法里面

选择排序、插入排序、冒泡排序、希尔排序

六月ゝ 毕业季﹏ 提交于 2020-03-05 03:14:38
简介 以下总结几个基础的排序算法,包括选择排序、插入排序、冒泡排序、希尔排序,这几个排序算法是比较简单的几个。以下给出算法的分析和代码示例。 时间复杂度 选择排序、插入排序、冒泡排序、希尔排序四个排序算法的时间复杂度都是O(n^2)。 算法分析 选择排序 选择排序取第一个元素以此与后续的元素进行比较,保存最小的元素的下标,最终把最小的元素与第一个元素进行交换,第二次遍历取第二个元素,在剩余元素中选择最小的元素与第二个元素交换,依次类推。。。。,最终实现把所有元素按照从小到大进行排序。 以下为代码示例 template<typename T> void selectionSort(T arr[], int n){ for(int i = 0 ; i < n ; i ++){ int minIndex = i; for( int j = i + 1 ; j < n ; j ++ ) if( arr[j] < arr[minIndex] ) minIndex = j; swap( arr[i] , arr[minIndex] ); } } 选择排序是基础的排序算法,但需要重点理解,以后复杂的算法也都会以此为基础进行衍生。 插入排序 插入排序分为两种,第一种是直接插入排序,第二种是折半插入排序,以下分别描述两种排序的基本思想: 直接插入排序的基本思想: 当插入第i(i>1)个元素时

数据结构-插入排序

末鹿安然 提交于 2020-03-03 00:54:18
1、插入排序 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。 插入排序的算法步骤如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 #include <stdio.h> void InsertSort(int* p, int n) { int temp,i,j; for (i = 0; i < n; i++) //每个元素都需要来插入,故比较n次 { temp = p[i]; //设置哨兵,为针对的第i个元素 for (j = i - 1; (j >= 0) && (p[j] > temp); j--) /

插入排序

杀马特。学长 韩版系。学妹 提交于 2020-03-02 04:17:38
for (int i = 1; i < n; ++i) {//从1开始,因为第0个不用插 int value = arr[i];//要插的元素 int j = 0;//插入的位置 for (j = i-1; j >= 0; j--) {//从后往前找 if (arr[j] > value) {//升序 arr[j+1] = arr[j];//移动数据,保证要插的在大数之前 } else { break; } } arr[j+1] = value; //插入数据,此时终于找到比要插的小的元素了,就把他插在小的后面,即j的后面j+1 } 来源: CSDN 作者: 希望能读博 链接: https://blog.csdn.net/qq_36299458/article/details/104591473

插入排序和归并排序

心不动则不痛 提交于 2020-03-01 02:24:39
插入排序 一共有三种:直接插入排序、希尔排序和折半插入排序。最后一个折半插入排序,感觉用在数组上面不太方便,就没写出来。 递归实现没有思路,使用的非递归算法。 直接插入排序 这个算法默认前n个数是已经排好序的,n随着你的插入逐渐变大,最开始是1。 然后从后往前逐渐查找应该插入的位置;我的算法是从小到大,那就依次对比当前位置的值是否比要插入的值大,如果大就往后移动一个位置,小于等于当前位置的值就进行插入结束这一次的插入操作,进入下一次。 希尔排序 这个排序算法的思路就是将数组分为好多组,然后逐渐减少,最终只剩下一组,就是最终的结果。 最开始将数组根据初始增量分为两两一组,在每一组内进行排序;逐渐缩短增量,直到增量为一,就是排好序的数组。 在组内排序的算法其实可以是别的算法。 折半插入排序 和直接插入排序思路相同,但是在查询插入点的时候,是从已经排好序的数组中间查询要插入的点,查询到之后将插入点之后的数依次后移,将数插入。 归并排序 数组从大依次切开,分为n组,然后再将相邻的两组进行合并,并排序,最后只剩下一组就是结果。这个算法使用递归会比较简单点。非递归实现,没思路。 代码 package 算法设计与分析 ; public class Work3 { public Work3 ( ) { int [ ] nums = { 2 , 3 , 8 , 4 , 5 , 7 , 1 , 9 ,

数据结构(一)

浪尽此生 提交于 2020-02-29 22:14:10
数据结构是什么? 数据结构使指数据之间的关系,包含有逻辑结构和存储结构。 逻辑结构分为线性(一对一),树状(一对多),图状(多对多),集合(无明显对应) 存储要正确反应逻辑 常见的存储类型有vector,list,deque等等 数据结构初入门(排序算法) 推荐几个排序总结博客 各种排序算法总结 排序算法总结——时间复杂度与稳定性 关于排序稳定性的定义 通俗地讲就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 1.冒泡排序 先码上代码 # include <iostream> # include <cstdio> # include <cmath> # include <ctime> # include <time.h> # include <algorithm> # include <cstring> using namespace std ; void BubbleSort ( int arr [ ] , int length ) { clock_t start , end ; start = clock ( ) ; for ( int i = 0 ; i < length ; i ++ ) { for ( int j = 0 ; j < length -

十大经典算法排序总结对比

ぐ巨炮叔叔 提交于 2020-02-28 13:31:56
十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n : 数据规模 k :“桶”的个数 In-place : 占用常数内存,不占用额外内存 Out-place : 占用额外内存 稳定性 :排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bubble Sort) 冒泡排序须知: 作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。。。冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。。。 什么时候最快(Best Cases): 当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊。。。。) 什么时候最慢(Worst Cases): 当输入的数据是反序时(写一个for循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗。。。) 冒泡排序动图演示: 冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1])

golang实现插入排序算法

北慕城南 提交于 2020-02-28 05:50:02
//插入排序 package alg func Insertion(arr []int) []int { len := len(arr) if len <= 1 { return arr; } for i := 1; i < len; i++ { //获取当前需要插入已排序区域的元素值 val := arr[i] j := i - 1 for ; j >= 0; j-- { if arr[j] > val { //移动数据 arr[j+1] = arr[j] } else { //如果arr[j]小于arr[i],则对已排序区无需再排序 break; } } //插入排序 第一位 arr[j+1] = val } return arr } 来源: oschina 链接: https://my.oschina.net/hackdebug/blog/3158511