插入排序

希尔排序 | 通俗易懂的理解排序过程

懵懂的女人 提交于 2019-11-29 06:43:48
响应群众需求,今天安排上「希尔排序」。 阅读本文前,请先服用「 插入排序 」,效果更加。 Content 实现过程 关键思路 代码实现 结合代码和中间过程,再体会 算法评价 「希尔排序」🆚 「插入排序」 听说有彩蛋❓ 👀「 更多排序 」 《 冒泡排序 | 通俗易懂的理解排序过程 》 《 选择排序 | 通俗易懂的理解排序过程 》 《 快速排序 | 通俗易懂的理解排序过程 》 《 插入排序 | 通俗易懂的理解排序过程 》 1. 实现过程 对 [5,4,1,3,2] 升序排列,中间步骤 ⬇️ 2. 关键思路 「希尔排序」—— 按固定间隔划分子序列,对每个子序列实现简单插入排序。 这么来看, 「希尔排序」可以拆解成两大步骤 : 划分子序列; 在子序列中简单插入排序。 Q:怎么划分子序列? 等间隔划分 。本例中,初始下标之差按照 d= n//2 计算,之后 d = d//2 循环更新。 先做远距离的移动,再逐渐缩小间隔 。这样,可以减少移动的次数,因为 极端情况,间隔为1时即退化为简单插入排序。 Q:简单插入排序怎么操作? 简单概括 —— 比较、后移、腾位置、插入target 。没看过简单插入排序的,点这里。 3. 代码实现 def ShellSort(arr): def ssort(arr, d): n = len(arr) for i in range(d, n): j = i-d #

C++学习之路1----插入排序

筅森魡賤 提交于 2019-11-29 06:22:36
目前C++就是大学本科C语言课程+研一赶鸭子上架边查语法边写了一个project(只得了二十分(满分一百的样子))的水平。。。自学python到字典章节,但又不想丢下C语言,所以先在这里立一个小小的flag,希望以后每天都能来更点东西。。 今天刚开始看算法导论的书,所以先写一点关于排序的问题----插入排序(INSERTION SORT),输入为数组a[5,2,4,6,1,3],输出元素从小到大排列的a数组。 完整代码: #include<iostream> using namespace std; void print(int a[], int n) { for (int j = 0; j < n; j++) { cout << a[j] << " "; } cout << endl; } void insertSort(int a[], int n) { for (int i = 1; i < n; i++) { if (a[i] < a[i - 1]) { int j = i - 1; int X = a[i]; while (j >= 0 && X < a[j]) { //a[j + 1] = a[j]; swap(a[j + 1], a[j]); j--; } //a[j+1] = X; } } } int main() { int a[6] = { 5,2,4,6,1

排序算法|插入排序

故事扮演 提交于 2019-11-29 04:59:18
目录 1. 插入排序的思想 2. 可优化点 3. 代码实现 4. 复杂度 本博客转载自 漫画:什么是插入排序? 1. 插入排序的思想 插入排序的思想是:维护一个有序区,将数据一个一个插入到有序区的适当位置,直到整个数组都有序。 给定无序数组如下: 把数组的首元素5作为有序区,此时有序区只有这一个元素: 第一轮 让元素8和有序区的元素依次比较。 8>5,所以元素8和元素5无需交换。 此时有序区的元素增加到两个: 第二轮 让元素6和有序区的元素依次比较。 6<8,所以把元素6和元素8进行交换: 6>5,所以把元素6和元素5无需交换。 此时有序区的元素增加到三个: 第三轮 让元素3和有序区的元素依次比较。 3<8,所以把元素3和元素8进行交换: 3<6,所以把元素3和元素6进行交换: 3<5,所以把元素3和元素5进行交换: 此时有序区的元素增加到四个: 以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下: 2. 可优化点 当插入一条数据到有序区域的时候,并不需要每次将数据进行两两交换。 什么意思呢?让我们以第三轮举例: 在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。 但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。 第一步,暂存元素3: 第二步

Java中的七大排序_2 希尔排序

女生的网名这么多〃 提交于 2019-11-29 01:54:28
希尔排序 简单点说: 将元素进行分组,每组在进行组内的插入排序,在重新分组、排序。直到最后全部元素归为一组,做最后一次插入排序 注意: 将待排元素分为gap组(gap=gap/3+1),开始gap=array.length。每一组元素也不是位置连续的, 而是把每组中的第一个元素连续放在一起,够gap个后在放每一组的第二个元素。 1.第一组:无序区间第一个数key=array[4]=2 2.第二组:无序区间第一个数key=array[5]=4 3.第三组:无序区间第一数key=array[6]=1 4.第四组:无序区间第一个数key=array[7]=5 5.再接着从第一组的无序区间的第二个元素key=array[8]=2开始 直到key第一轮走完全程,第一轮结束的结果 在会分新的组,gap=gap/3+1=4/3+1=2.分为两组 6.重新分为两组后 再重复以上比较移动交换的操作,完成第二次每组的排序 8.走到最后再分组gap=2/3+1=1组 最终比较完成后结果: 代码实现 //希尔排序 public static void shellSort(int[] array) { int gap = array.length;//分组的个数 while (true) { gap = gap / 3 + 1; insertSortWithGap(array, gap);//分组的插入排序

Java中的七大排序_1 插入排序

北城余情 提交于 2019-11-29 00:57:52
一:七种排序 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序 二、排序思想(以非降序排列为例) 简单点说: 将待排元素分为有序区间和无序区间,并假设第一个元素已经有序。每次取出无序区间的第一个值记作key吧,将它与有序区间的元素从后往前进行比较,大于等于有序区间最后一个数,就放后边当成新的有序区间的最后一个数;小于的话,就继续往前比较,直到找到一个比它还小的有序区间的数,并把key插入到该值的后边。 注意: 我们在有序区间插入元素时,一定要提前空好位置在做插入操作,如果直接插入,会导致原来数据被覆盖而丢失。所以要先将插入位置之后的 有序区间 的元素从后往前依次向后移动一下,(从后往前,还是为了避免数据被覆盖)。这样操作后,就会将插入位置空出,此时,在将key插入 三、图示:以排18292415224为例 1.将元素分为有序区间和无序区间,并假设第一个元素已经有序 2.key从无序区间第一个开始有序的下一个),key=8大于等于有序区间最后一个数,就放后边当成新的有序区间的最后一个数,接着进行下一步的key值比较定位 3.key=2,小于有序区间的最后一个数8,就继续往前比较,直到找到一个比它还小的有序区间的数,在该数之后做插入 4.先将插入位置之后的有序区间的元素从后往前依次向后移动一下,腾出空位,插入key 5.key=9,key>=8

排序——01

谁说胖子不能爱 提交于 2019-11-28 21:45:35
本文主要内容: 1.插入排序 2.希尔排序 3.直接选择排序 4.堆排序 1.排序:默认情况下为非降序排序 2.稳定性:能够保证排序过程中相同的数据排序前后相对位置不变 3.插入排序:减治算法排序 每次从无序区间选择第一个数插入到有序区间的合适位置(打牌) 时间复杂度:最坏o(n的平方):完全逆序 最好o(n):完全有序[从后往前找] 一般情况:o(n的平方) 越接近有序,执行时间效率越高 空间复杂度:o(1) 稳定性:稳定 计时:long begin = System.naoTime ();long end = System.naoTime (); System.out.println(end-begin); 4.希尔排序(Shell Sort):分组进行插入排序 分组越多:大数据可以很快走到最后,每次分组排序后,数据不太有序 分组越少:每次分组排序后,数据更有序 size = 10;gap = size; gap = gap/3+1;[4,2,1] gap = gap/2;[5,2,1] 前提:利用插入排序中,数据越接近有序,时间效率越高。在插入排序之前做预排序(分组插排),使数据尽可能接近有序。 如何分组:一开始分很多组,越来越少 时间复杂度:最好:o(n) 平均:O(n 1.3,n 1.4) 最坏:O(n^2) 空间复杂度:O(1) 稳定性:不稳定

排序之插入排序

守給你的承諾、 提交于 2019-11-28 20:42:30
# 插入排序时间复杂度:O(n**2)代码: # 插入排序 def insert_sort(li): for i in range(len(li)): # 摸到的牌的下标 tmp = li[i] # 记录摸到的牌 j = i - 1 # 手里的牌的下标 while j >= 0 and tmp < li[j]: li[j + 1] = li[j] j -= 1 li[j + 1] = tmp print(li) 思路: while j >= 0 and tmp < li[j]: li[j + 1] = li[j] j -= 1在找摸到的牌要插入的位置,每当摸到的牌比手里的牌小,就会找到摸到的牌要插入的位置,找到后将摸到的牌插入比摸到牌小的牌的前一个位置(j+1) 来源: https://www.cnblogs.com/xiangxiaolin/p/11427148.html

插入排序算法实现与分析(python)

旧城冷巷雨未停 提交于 2019-11-28 19:29:18
插入排序算法实现与分析(利用python) 插入排序算法 1、具体过程如下: 2、最佳情况 3、最坏情况 插入排序算法 插入排序算法,是一个对少量元素进行排序的有效算法。 1、具体过程如下: 1、假设存在乱序数组A[n],需要对其进行排序(当然,排序算法种类比较多,但是此次采用的是插入排序算法)。 2、在开始进行排序时,已知条件是:只包含一个元素的数组是已排序的,即A[0]是已排序的 3、在循环当中,通过比较A[ j ]与已排序的数组内部元素的数值大小,将A[ j ]放入到已排序数组中,更新已排序数组,以此类推。 示例代码如下: import numpy as np def Insertion_Sort(sample_array:np.ndarray): for j in range(1, len(sample_array), 1): key = sample_array[j] #insert A[j] into the sorted sequence A[0,...j-1] i = j - 1 while i >= 0 and sample_array[i] > key: sample_array[i+1] = sample_array[i] i = i - 1 sample_array[i+1] = key return sample_array def main():

插入排序

十年热恋 提交于 2019-11-28 18:20:48
思想: 将数组分为两部分,一部分有序,一部分无序。每次从无序中拿一个数,在有序数组找一个坑,把这个无序的数放入坑中。(这样会有一个,你占啦别人的坑,别人 怎么办呢?那么就要将插入坑中的地方的后面的数据都往后面移动,这样就不会出现问题)。其实每次拿出的无序的数有两个插入位置,要么是本身的位置,要么是 有序数的那部分中的某个位置 public class sort_insert { public static void main(String[] args) { int a[]={1,7,3,9,0,4,5,6}; int b[]=a; for(int i=0;i<a.length;i++) System.out.print(a[i]+" "); System.out.println(); insert_sort(a); for(int i=0;i<a.length;i++) System.out.print(a[i]+" "); System.out.println(); } public static void insert_sort(int a[]){ int temp; int j; for(int i=1;i<a.length;i++){ j=i; temp=a[i]; //两种循环实现 // int k=i; // for( k=i-1;k>0&&temp<a[k];k--

算法(三)插入排序

余生颓废 提交于 2019-11-28 18:18:31
排序原理 所谓的插入排序跟我们打牌在调整我们手里牌的顺序原理是一样的,也就是说将未排序的元素依次插入到前边已经排好序的元素中适当的位置,知道全部插完为止。 时间复杂度 排序代码 public class InsertionSort { /** * 插入排序优化版本 * 适用场景:数组接近有序的情况下 */ public void insertionSortV(int[] arr, int a, int n) { for (int i = 1; i < arr.length; i++) { //将外层循环的元素复制一份, int e = arr[i]; //记录外层元素应该插入的位置 int j; /** * 内层循环,与外层循环复制的那个元素进行比较,如果 * 小于被比较的元素,将被比较的元素向后移动,然后再用复制的元素 * 在跟以前的前边的元素比较,以此类推,直到找到比他大的元素终止循环,将给元素放在比他大的后边 */ for (j = i; j > 0 && arr[j - 1] > e; j--) { arr[j] = arr[j - 1]; } arr[j] = e; } } } 来源: https://blog.csdn.net/Suubyy/article/details/100071953