直接插入排序

程序员必知8大排序3大查找

心不动则不痛 提交于 2019-12-22 17:01:57
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。 要编写出优秀的代码同样要扎实的基础,如果排序和查找算法学的不好,怎么对程序的性能进行优化?废话不多说,本文要介绍的这些排序算法就是基础中的基础,程序员必知! 1、直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例 2、希尔排序(也称最小增量排序) (1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。 (2)实例: 转自csdn博客点击查看详情 来源: https://www.cnblogs.com/yudanmomo/archive/2012/05/07

直接插入排序

杀马特。学长 韩版系。学妹 提交于 2019-12-21 07:22:12
直接插入排序学习 算法思想 :直接插入排序是一种最近本的插入排序方法,其基本操作时将第i歌记录插入到前面i-1个已排好序的记录中。具体过程为:将第i个记录的关键字Ki,顺次与其前面记录的关键字K i-1,K i-2,…K1进行比较,将所有关键字大于Ki的记录一次向后移动一个位置,知道遇见一个关键字小于或者等于Ki的记录Kj,此时Kj后面比为空位置,将第i个记录插入空位置即可。完整的直接插入排序时从i=2开始的,也就是说,将第一个记录视为已排好序的单元素子集合,然后将第二个记录插入到单元素子集合中。i从2循环到n,即可实现完整的插入排序。 /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package paixu ; public class PaiXu { public static void main ( String [ ] args ) { int [ ] a = { 48 , 62 , 35 , 77 , 55 , 14 , 35 , 98 } ;

直接插入排序算法

一个人想着一个人 提交于 2019-12-11 20:43:44
直接插入排序算法 思路: 一个无序数组,首先把第0位当作有序数组,从第1位开始进行比较,找到合适的位置进行插入,在插入完成后,这又是一个有序数组,在从后面的数中跟前面的数进行比较,插入在合适的位置。 代码说明: //直接插入排序算法 public static void insertSort ( int [ ] arr ) { //声明插入的数 int insertVal = 0 ; //声明插入的索引 int insertIndex = 0 ; //一开始把前面第0位当作有序数组,从后一位开始插入比较 for ( int i = 1 ; i < arr . length ; i ++ ) { //要插入的位置是前面一位或几位 //先跟前一位比较 insertIndex = i - 1 ; insertVal = arr [ i ] ; //为了防止插入索引越界 while ( insertINdex >= 0 && insertVal < arr [ insertIndex ] ) { arr [ insertIndex + 1 ] = arr [ insertIndex ] ; //往前一位寻找 insertIndex -- ; } //如果插入索引还是在插入位置的前一位,则不需要交换 if ( insertIndex + 1 != i ) { //索引下标始终在前一位

排序算法:直接插入排序

北战南征 提交于 2019-12-06 22:28:09
直接插入排序是一种最简单的 插入排序 。 插入排序 :每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。 在讲解直接插入排序之前,先让我们脑补一下我们打牌的过程。 先拿一张5在手里, 再摸到一张4,比5小,插到5前面, 摸到一张6,嗯,比5大,插到5后面, 摸到一张8,比6大,插到6后面, 。。。 最后一看,我靠,凑到全是同花顺,这下牛逼大了。 以上的过程,其实就是典型的 直接插入排序,每次将一个新数据插入到有序队列中的合适位置里。 很简单吧,接下来,我们要将这个算法转化为编程语言。 假设有一组无序序列 R0, R1, … , RN-1。 (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。 (2) 然后,我们要依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个 外部循环 ,从下标 1 扫描到 N-1 。 (3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。 所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个 内部循环 ,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。 核心代码 public void insertSort(int[] list)

排序算法:直接插入排序算法实现及分析

萝らか妹 提交于 2019-12-06 22:27:58
直接插入排序算法介绍 还是先过一遍定义。 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。 来我们用通俗一点的话说,就是把数组中元素一个个取出插入到有序表中,直到将数组元素全部插入到有序表中。 那么如何构造有序表呢?我们不需要构造,有序表 只是一种形式。当有序表中只有一个元素时,那它肯定是有序的呀。所以我们开始将第0个元素当做有序表 。 我们先假定升序。int temp = arr[1]与有序表的最大值arr[0]进行比较,arr[1]<arr[0]那么arr[0]就往后挪,挪到arr[1]的位置,此时temp 和 有序表中的第二个最值进行比较,发现和有序表比较完了,temp 就放到arr[0]处呗。 现在我们假定有序表中已经有多个元素了。 我们取到数组中的第i个数组元素,往 0~ i-1 的有序表中进行插入,它的比较过程如下 : 跟有序表的最大值arr[i-1]比较,发现比最大值小,将最值arr[i-1]往前挪,继续和有序表中第二大的值arr[i-2],进行比较,如果还是发现比它小,这有序表中的第二大的值arr[i-2]继续往前挪,继续 进行比较 直到找到有序表中第 j 个元素比当前元素要小 或者将有序表找完了。将当前元素放到 j+1 的位置,这样就找到了第i元素要插入的位置了。

直接插入排序

北城以北 提交于 2019-12-06 00:33:50
算法例题 用随机函数生成16个2位正整数(10~99),利用直接插入排序法将其排序。 算法思路 书面概括 将待排序的元素存放在数组r[1...n]中,r[1]是一个有序序列; 循环n-1次,每次使用顺序查找法,查找r i 在已排好序的序列r[1...r-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1..i-1],直到将r[n]插入表长为n-1的有序序列r[1...n-1],最后得到一个表长为n的有序序列。 个人概括 1.引入一个无序序列 2.引入时就确定第一个为有序序列 3.将无序序列中第一个待排序元素加入监视哨 4.将无序序列中第一个待排序元素依次与有序序列中从大到小的元素比较 5.若待排序元素大于或等于有序序列中最大的元素,则直接插入到有序序列中的最后位置 6.若待排序元素小于有序序列中最大的元素,则逆序与有序序列的元素比较(省略了中间几步) 7.若待排序元素 小于有序序列中某个元素 小于有序序列中最小元素,这种情况也没有关系,因为我们有监视哨的存在 则要将有序序列中大于待排序元素的所有元素往后移,(就是给待排序元素腾位置),再将监视哨中保存的待排序元素插入有序序列适合的位置。 8.结果(省略n步) 考虑情况 排序过程会有三种情况 待排序元素大于有序序列中最大的元素; 待排序元素小于有序序列中的元素,但不小于有序序列中最小的元素;

对冒泡、直接插入、快速、归并四种排序方式的理解,以及实际应用时的感受。

蓝咒 提交于 2019-12-04 22:35:03
以下所有程序的运行环境均为Code::Block,代码在不同编译器下运行,结果可能会有有所不同 如,以下定义变量的位置并非全在程序开头,在VC上,可能会报错。改正方法:将程序里定义变量的语句放在程序的开头即可。 ************************************************************************************************************************************************************************************************ 话不多说,直接进入正题: 一):直接插入排序(插入排序有多种类型,这次讲平时应用最多的) 代码实现如下:(以正序输出为例,倒序输出,仅需对代码进行适当修改即可) #include<bits/stdc++.h> #include<algorithm> using namespace std; int a[100055]; int main() { int n,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; } int head; head = 2; while(head<=n) { i = head; while(i>=2&&a[i]<a[i-1]) { if

排序算法---之插入排序(直接插入排序&希尔排序)

别来无恙 提交于 2019-12-04 19:08:04
排序算法--之插入排序 一、排序算法分为: 1.插入排序(直接插入排序&希尔排序) 2.交换排序(冒泡排序&快速排序) 3.选择排序(直接选择排序&堆排序) 4.归并排序 二、下面这张图对排序算法的时间复杂度&空间复杂度&稳定性做了一个总结: 二(1)、插入排序-----直接插入排序 1.算法代码(升序) //直接插入排序 void InsertSort(int *a,size_t n) { assert(a); for(size_t i=0;i<n-1;++i) { int end = i;//下标 int tmp = a[end+1];//要插入的那个数 while(end>=0) { if(a[end]>tmp) { a[end+1] = a[end]; --end; } else { break; } } a[end+1] = tmp;//若最小的数在最后一个,end会--到-1, } } //测试代码 void PrintArray(int* a,size_t n) { for(size_t i=0;i<n;++i) { cout<<a[i]<<" "; } cout<<endl; } //测试代码 void InsertSortTest() { int a[]={2,5,4,0,9,3,6,8,7,1}; PrintArray(a,sizeof(a)/sizeof(a

排序算法---直接插入排序和希尔排序

…衆ロ難τιáo~ 提交于 2019-12-04 19:07:45
排序算法大致可分为: 1.插入排序 --- 直接插入排序、希尔排序 2.选择排序 --- 选择排序、堆排序 3.交换排序 --- 冒泡排序、快速排序 4.归并排序 本篇博客主要介绍插入排序。。 ps:以下两种排序算法都是以升序为例讲解! 一、直接插入排序 直接插入排序的思想: 假设数组第一个数是有序的,从第二个数开始遍历,每拿出一个数就和前面的有序的数比较,如果比它小,就往前面插;否则就排在后边,插入后将前面的有序数组+1。这样走下去,前面的一部分数组总是有序的,直到遍历完这个数组后,整个数组也是有序的。 (其实也就是相当于把数组分为有序和无序的两部分) 代码解决: 我们可以设置一个pos,使pos来遍历前一个有序的数组,当从无序数组中拿出一个数据a[i]时,用pos找到这个数的位置,再进行插入 void InsertSort(int* arr,size_t size) { assert(arr); //假设第一个是有序的 for (size_t index=1; index<size; ++index) { int pos = index-1; int tmp = arr[index]; while (pos >= 0 && arr[pos] > tmp) { arr[pos+1] = arr[pos]; pos--; } arr[pos+1] = tmp; } }

直接插入排序和选择排序

匿名 (未验证) 提交于 2019-12-03 00:43:02
(一)直接插入排序 思路: (1)用一个临时变量存放待排序的数字; (2)从数组前依次遍历找第一个比待排序数字大的数字的位置; (3)将从待排序的数字位置开始,到找的要插入的数字的位置之间的数字向后挪一位,最后将待排序数字插入到找到的位置; 代码如下: void Insert_Sort( int *arr,int len ) { int tmp = 0;//当作哨兵位 for( int i = 1; i < len; ++i ) { tmp = arr[i]; for( int j = 0 ; j < i ;++j ) { if( tmp < arr[j] )//找到第一个比tmp大的数字; { break; } } for( int k = i - 1 ;k >= j ;j-- )//将i-j之间的数字向后挪动一位, { arr[k+1] = arr[k]; } arr[j] = tmp ;//在j的位置插入待排序数字 } } 上述代码的时间复杂度为O(n^2),如果给出的数字本来就有序,即最好的情况下时间复杂度也为O(n^2),空间复杂度为O(1); 最好情况比如 12345 也是 O(n~2);从前往后找太浪费时间 优化: 采取从后往前找比待排序数字小的数字的位置,插入在此数字的后面,在没有找到之前将数字往后挪动一位; 最好情况 12345 时间复杂度是O(n);空间复杂度