算法 (排序乐园Lv-2) 插入排序代码实现
2017-12-07 23:57
393 查看
游乐项目-2- 插入排序
假设数组下标为a[0…n-1]初始时a[0]自成一个有序区,无序区为a[1] ~ a[n-1] ,令i=1
将a[i]插入到前面的a[0] ~ a[i-1]的有序区里,形成a[0] ~ a[i]的有序区,i++
重复执行第二步直到数组全部有序
代码实现-1
void Insertsort_1(int a[], int n) { int i, j, k; //-----------------------------------for:下标从1~n-1扩大有序区的过程 for (i = 1; i < n; i++) { //-----------------------从有序区的最后一个元素开始向前遍历,找到它的位置 for (j = i - 1; j >= 0; j--) 这里默认是递减有序区 if (a[j] < a[i]) break; //-------------------------------------- if (j != i - 1) { //-------------------------------------- int temp = a[i]; for (k = i - 1; k > j; k--) a[k + 1] = a[k]; //-------------------------------------- a[k + 1] = temp; } } }
重点-1 为什么要在 j!=i-1的前提下执行交换
如果j=i-1说明a[j]已经比有序区最小的还要小,a[0]~a[j]已经是有序的
代码实现-2
void Insertsort2(int a[], int n) { int i, j; for (i = 1; i < n; i++) if (a[i] < a[i - 1]) { int temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) a[j + 1] = a[j]; a[j + 1] = temp; } }
执行步骤
- 首先是从0~n开始寻找第一个不满足有序数列的点 -> if (a[i] < a[i-1]) -> 本应递增的现在反而小了 - 找到了以后,先开始从逆反的上一个点着手,查看这个temp是不是比他小,如果小,就执行交换 - 如果还是要大,就执行:将后面的点往后移的同时,在向前一个点判断大小 - 重复这个过程
Why j>=0 && a[j]>temp?
- This is the condition that decides if we will move on forward - I.E. "If a[i] or temp still too large , we move one place forward"
经常写错的地方;
在for循环结束的地方,这时候的j满足 array[j] < temp
所以要在j+1的位置上附上temp -> array[j+1]=temp;
相关文章推荐
- 算法 (排序乐园Lv-3) - Qsort代码实现
- 算法代码实现之三向切分快速排序,Golang(Go语言)实现
- 排序技术_各种算法原理 图解 代码实现
- 算法学习与代码实现2——插入排序
- 单链表实现排序算法之插入排序
- 【数据结构与算法】【排序】堆排序的代码实现
- C语言入门:插入排序(代码实现,而不是排序方法阐述)
- 【数据结构与算法】【排序】直接插入排序的代码实现
- 算法代码实现之归并排序,C/C++实现,自顶向下与自底向上两种方式
- Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)
- 算法代码实现之快速排序,Java实现
- 【数据结构与算法】【排序】归并排序的代码实现
- 排序技术_各种算法原理 图解 代码实现
- 冒泡排序、选择排序、插入排序 算法实现
- 【数据结构与算法】【排序】希尔排序的代码实现
- JavaScript实现经典排序算法之插入排序
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现