直接插入排序

排序问题

天大地大妈咪最大 提交于 2020-01-17 17:31:07
排序总共分为8种, 插入排序分为直接插入排序和希尔排序 选择排序分为简单排序和堆排序 交换排序分为冒泡排序和快速排序 还有两种归并排序和基数排序 谭浩强书上给了3种排序,起泡法,比较交换法和选择法 1.直接插入排序 void insert_sort(int a[],int n){ int i,j,temp; for(i=1;i<n;i++) if(a[i]<a[i-1]){ temp=a[i]; for(j=i-1;temp<a[j]&&j>=0;j--) a[j+1]=a[j]; a[++j]=temp; } } 2.希尔排序 void shell_insert(int a[],int n,int d){ int i,j,temp; for(i=d;i<n;i++) if(a[i]<a[i-d]){ temp=a[i]; for(j=i-d;j>=0&&temp<a[j];j=j-d) a[j+d]=a[j]; a[j+d]=temp; } } void shell_sort(int a[],int n){ int d=n/2; while(d>0){ shell_insert(a,n,d); d=d/2; } } 3.简单选择排序 void select_sort(int a[],int n){ int i,j,k,temp; for(int i=0;i<n-1;i++){ k

直接插入排序

本秂侑毒 提交于 2020-01-14 09:01:52
其实这个没什么可讲的,就像前面说的: 如果有一个长度为n的有序数组a,现在又一个元素要插入到数组a,并使数组a依然是有序的,应该怎么做。 先说那些是必要做的事情,我们必须找到要插入的元素应该处于的下标,然后把这个下标及下标后面的元素都整体向后移。下面就这两件事请,说下程序应该怎么写。注意上面的假设: 如果有一个长度为n的有序数组a,现在又一个元素要插入到数组a,并使数组a依然是有序的,应该怎么做。 第一种,直接又简单的思路。直接比较从前向后比较或从后向前比较,找到位置,这里肯定是要循环遍历的。然后需要要整体移动多吧,在数组这种数据结构中要整体移动还是要进行遍历移动操作,并从先移动最后一个元素n到n+1,在移动n-1到n。遍历两次,比较一遍,移动一遍。 第二种,优化第一种思路。在第一种思路中有两次遍历,一次是为了找位置,一次是为了移动元素,这两次遍历完全可以一次性做到,如果是升序排列,要插入的元素在数组中的下标是n(n>0,单独一个下标为0的元素,天然是有序的),首先我们把这个先把为n的元素的值单独拿出来保存为变量temp,然后我们只需要从数组(下标0-n,不包括n数组已经有序的那个部分认为是一个完成数组)的尾部开始遍历,现在假设遍历到了下标为i的元素。如果i>temp,直接把i向后移动一个位置就OK了(不需要其他操作,这里不是交换,只要把i后移一下就可以了),如果i<temp

C++ 希尔排序

我只是一个虾纸丫 提交于 2020-01-11 00:14:37
两个49在排序前后位置颠倒了,所以希尔排序是不稳定的 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 希尔排序的基本思想是: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 设计思路: 1.首先用一个增量来分组,控制增量为一层循环 2.然后控制分组为1层循环,假如增量一开始为5,则分组为:第一组:0 5 15…第二组:1 6 11… 3.直接插入排序 注意这里是对这些分组进行直接插入排序 最后增量为1,就是对整个序列进行直接插入排序 # include <iostream> using namespace std ; //希尔排序 void shellSort ( int arrs [ ] , int len ) { for ( int d = len / 2 ; d >= 1 ; d = d / 2 ) { //控制增量 for ( int k = 0 ; k < d ; k ++ ) { //控制分组 for ( int i = k + d ; i < len ; i = i + d ) { //直接插入排序 //直接插入排序

排序——插入排序(直接插入排序、希尔排序、折半插入排序)

心已入冬 提交于 2020-01-04 02:39:55
排序这个文章我本来想写一篇的,但是想了想太长了,最后我还是决定拆开来写吧。第一部分主要是讲插入排序的,包括直接插入排序和希尔排序。 排序算法合辑 排序——插入排序(直接插入排序、希尔排序、折半插入排序) 排序——插入排序(交换排序、快速排序) 排序——选择排序(简单选择排序、堆排序) 文章目录 直接插入排序(straight insertion sort) 代码 算法分析 实例 折半插入排序 代码 希尔排序(shell sort) 排序过程 代码 算法分析 实例 直接插入排序(straight insertion sort) 直接插入排序算法简单、容易实现,当序列中的记录基本有序或待排序记录较少时,是最佳的排序方法。 基本思想 是依次将待排序序列中的每一个记录插入到一个已排好序的序列中,直到全部记录都排好序。可以想一下打扑克的时候,每抓到一张牌就会插入到你手中已经按顺序理好的牌中。 将整个待排序的记录划分为有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有的剩余待排序记录 讲无序区第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录 重复2直到无序区中没有记录为止。 例如待排序序列序列 12 15 9 20 6 31 24 初试键值序列 [ 12 ] 15 9 20 6 31 24 第一趟 [ 12 15 ] 9 20 6 31

希尔排序(2)

情到浓时终转凉″ 提交于 2020-01-03 05:22:46
希尔(Shell)排序又称为 缩小增量排序 ,它是一种 插入排序 。它 是直接插入排序算法的一种威力加强版 。 希尔排序的 基本思想 是: 把记录按 步长 gap 分组,对每组记录采用 直接插入排序 方法进行排序。 随着 步长逐渐减小 ,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。 我们来通过演示图,更深入的理解一下这个过程。 在上面这幅图中: 初始时,有一个大小为 10 的无序序列。 在 第一趟排序中 ,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。 接下来,按照直接插入排序的方法对每个组进行排序。 在 第二趟排序中 ,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。 按照直接插入排序的方法对每个组进行排序。 在 第三趟排序中 ,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。 按照直接插入排序的方法对每个组进行排序。此时, 排序已经结束 。 需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中, 两个元素位置交换 了。 所以,希尔排序是不稳定的算法。 public

常见排序算法

旧巷老猫 提交于 2020-01-03 05:04:42
索引 1. 插入排序 1.1 直接插入 1.2 折半插入 1.3 希尔排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择 3.2 堆排序 4. 归并排序 4.1 迭代归并 总结 1. 插入排序 思想 :每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。 1.1 直接插入 1.1.1 方法: 当插入第i (i >= 1) 个对象时, 前面的V[0], V[1], …, V[i-1]已经排好序。这时, 用V[i]的排序码依次与V[i-1], V[i-2], …的排序码顺序进行比较, 找到插入位置即将V[i]插入, 原来位置上的对象向后顺移。 具体过程: 1. 把n个待排序的元素看成为一个“有序表”和一个“无序表”; 2. 开始时“有序表”中只包含1个元素,“无序表”中包含有n-1个元素; 3. 排序过程中每次从“无序表”中取出第一个元素,依次与“有序表”元素的关键字进行比较,将该元素插入到“有序表”中的适当位置,有序表个数增加1,直到“有序表”包括所有元素。 1.1.2 实例图: 1.1.3 代码: /** * 直接插入排序:将数组从小到大排序 */ #include <iostream> using namespace std; typedef int Index;//下标的别名

算法系列:排序算法

亡梦爱人 提交于 2020-01-03 04:59:36
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明。 ----------------------------------------------------- ------------------------------------ 开始学习排序算法,此篇是总体介绍。 学习算法的入门资料当然是 算法导论 ,大家可以上 MIT 的 OCW 站看看, http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm , 另外还有第 3 版的笔记和 PPT, http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-006Spring-2008/CourseHome/index.htm , 这是 网易公开课地址 。 维基的资料 不能少。 以下是一些很好的博客文章: http://blog.csdn.net/hguisu/article/details/7776068 http://blog.csdn.net/v

数据结构:直接插入排序

拟墨画扇 提交于 2020-01-01 20:36:31
一、直接插入排序 直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 1 void insert_sort(int a[], int n) 2 { 3 int i, j, k; 4 5 for (i = 1; i < n; i++) 6 { 7 //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 8 for (j = i - 1; j >= 0; j--) 9 if (a[j] < a[i]) 10 break; 11 //如找到了一个合适的位置 12 if (j != i - 1) 13 { 14 //将比a[i]大的数据向后移 15 int temp = a[i]; 16 for (k = i - 1; k > j; k--) 17 a[k + 1] = a[k]; 18 //将a[i]放到正确位置上 19 a[k + 1] = temp; 20 } 21 } 22 } c++实现代码: 1 #include <iostream> 2 using namespace std; 3 void insertSort

直接插入排序

倾然丶 夕夏残阳落幕 提交于 2019-12-24 18:44:08
1、直接插入排序基本思想 将一个记录插入到已排好序的序列中,从而得到一个新的有序序列(将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序) 可以选择不同的方法在已经排好序数据表中寻找插入位置。根据查找方法不同,有多种插入排序方法,下面要介绍的是直接插入排序。 2、排序过程分析 设待排序的表有10个元素,其关键字分别为{9,8,7,6,5,4,3,2,1,0},直接插入排序的过程如下: 3、算法实现 -C语言 # include <stdio.h> # include <stdlib.h> # include <math.h> # include <string.h> /* 参数a为需排序的数组 参数n为数组需排序的个数 */ void Insertion_Sort ( int a [ ] , int n ) { int i = 0 , j = 0 ; //循环变量 int temp ; //存储待排序的元素 for ( i = 1 ; i < n ; i ++ ) { temp = a [ i ] ; for ( j = i - 1 ; j >= 0 && temp < a [ j ] ; j -- ) //当未达到数组的第一个元素或者待插入元素小于当前元素 { a [ j + 1 ] = a [ j ] ; /

直接插入排序算法

佐手、 提交于 2019-12-23 22:10:48
直接插入排序算法(用于理解) 一个带排序数组    array[] 元素个数 size = array.length 两个指针表示元素位置    int i 和 int j   i 表示待排序元素的位置  ,   j 和 i 相等,为了表示已经排好序的元素位置 快树排序就是把一个待排元素排进已排好的队列中,因此需要 两层循环 第一层循环 for( i = 1;i < size;i++) i 表示待排元素的位置,从第二个元素开始所以 i 初始化为1   循环内部设置 int temp = array[i] ;   再设置 j = i;  因为这层循环每完成一次,已经排好序的元素就多一个。(为什么j=i 而不是 j = i-1 ,也可以那么赋值,看个人喜好。主要就是表述已经排序好的最后一个元素的位置) 第二层循环为找到插入位置 while( j-1 >= 0 && array[j-1] > temp)  表示如果前面还有比 temp 小的元素就继续循环   循环内部开始排序   array[j] = array[j-1];   将比 temp 大的那个元素与 temp 交换   前面还有元素     j -- ;  前面还有没比较的元素 到此算法完成 void InsertSort(T* array, int n) { int i, j; T temp; / for (i = 1; i