关闭

插入排序

标签: 算法插入排序C++
169人阅读 评论(0) 收藏 举报
分类:

思路来自算法导论,貌似有点麻烦 ╮(╯▽╰)╭

类似玩扑克牌时,获得手牌,但是牌序是乱的,因此需要进行排序。
排序方法是:
第1张牌作为基准,默认为排序正确。

第2张牌作为待排序牌,并将牌值用key保存,和第1张牌进行比较,第1张大则将第1张牌移到第2张
牌的位置,并将第2张牌移到第1张牌的位置(交换)。算法实现为将第2张牌赋值为第1张牌的值,
并将第1张牌的值赋值为key(第2张牌的值),实现交换。

第3张牌作为待排序牌,并用key值保存,和第2张牌(先)、第1张牌(后)进行比较,并在满
足条件时进行交换。算法实现时,找到第3张牌的合适位置,并将此位置到第3张牌中间所有的牌往后
移(循环向后赋值),最后将第3张牌的值赋值到合适位置。

之后的牌以此类推进行操作,最终实现排序。

#include<iostream>
using namespace std;

//插入排序算法
void insertSort(int* arr,int length){
  int key=0;  //用于保存当前所指牌的值
  int j=0;  //用于遍历当前位置的前面所有位置
  for(int i=1;i<length;i++){
    key=arr[i];  //保存当前所指牌的值
    j=i-1;  //指向当前位置的前一个位置

    /*
      j从i-1遍历到0,每次arr[j]>key时,j+1 ~ i-1所指的位置的值都是大于key的,已
      进行向后移动,因此arr[j+1]一定是保存到了arr[j+2]中了的,不必担心arr[j+1]
      的数据被无故覆盖。
      一旦找到的arr[j]不大于key,此位置即arr[i]需要插入的,故在最后arr[j+1]=key将
      key值放入arr[j+1]中。(此arr[j+1]中的值同上,也是已被移动到arr[j+2]中,不必
      担心数据被无故覆盖)。
     */
    while(j>=0&&arr[j]>key){  //找到i-1 ~ 0之间所有大于key的值,并向后移动
      arr[j+1]=arr[j];
      j=j-1;
    }
    arr[j+1]=key;  //找到了j+1为插入位置,将key值插入到此处
  }
}

//简单验证
int main(){
  int arr[100];
  int length=0;

  //输入
  cout<<"请输入数组长度(1~100): ";
  cin>>length;
  cout<<"请输入每个数组元素: ";
  for(int i=0;i<length;i++){
    cin>>arr[i];
  }

  //排序
  insertSort(arr,length);

  //输出
  cout<<"排序后: ";
  for(int i=0;i<length;i++){
    cout<<arr[i]<<" ";
  }
  cout<<endl;
  return 0;
}

运行示例:
运行示例

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

插入排序算法之C++实现

插入排序,顾名思义其实现形式是插入. 在整个大小不一的队列中, 第一次: 从一个元素开始,将后面相邻的元素(第二个元素)提取出来,放在一个变量中暂时保存,然后和第二个元素前面的那个元素(第一个元素)做比较,如果比它大,当然就不变动位置;但如果比它小,就将前面那个元素移动到第二个元素的位置,然后将变量...
  • stzy00
  • stzy00
  • 2015-03-12 23:31
  • 1514

排序算法(五)2-路插入排序

1、 2、 3、 4、 5、 6、 7、 8、
  • wwkaven
  • wwkaven
  • 2014-11-25 08:07
  • 675

插入排序:2路插入排序原理分析及源码演示

原理2路插入排序是在直接插入排序的基础上进行优化:减少排序过程中元素移动的次数。不过需要额外增加n个辅助空间。关键思路把新增的辅助空间(n个元素的数组),当做一个环对待,再第一个元素插入之后(标记当前最大最小元素),以后分别从两边插入数据,比最大元素大的放右边,比最大元素小的放左边。 如果大于最小...
  • scuyxi
  • scuyxi
  • 2017-04-23 22:07
  • 320

数据结构例程——插入排序之直接插入排序

本文是[数据结构基础系列(9):排序]中第2课时[插入排序之直接插入排序]的例程。1.直接插入排序#include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[1...
  • sxhelijian
  • sxhelijian
  • 2015-11-28 16:48
  • 3690

插入排序:表插入

所谓插入排序之表排序,是利用静态链表的形式,分两步完成排序。 一,对一个有序的循环链表,插入一新的元素,修改每个节点的后继指针的指向,使顺着这个指针的指向,元素是有序的。在这个过程中,我们不移动或交换元素,只是修改指针的指向。 二,顺着指针的指向调整元素的位置,使其在链表中真正做到物理有序。 思路:...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014-06-02 20:44
  • 2359

插入排序——深入浅出(图解)

一、基本思想通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。...
  • as02446418
  • as02446418
  • 2015-08-17 20:46
  • 1745

排序算法(三)——插入排序及改进

插入排序 基本思想 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 java实现 //插入排序 public void insertionSort(){ ...
  • u012152619
  • u012152619
  • 2015-08-06 00:04
  • 2777

从VB来看-InsertionSort(VB插入排序)

插入排序(Insertion Sort) 它是通过不断将未排序数据插入有序序列,一次次循环加入待排序数据扩充有序序列部分,来达到最终的排序目的。很像我们平时发牌时一张张整牌的过程:我的习惯是先把最左边第一张作为有序部分,之后每拿取一张牌进行大小比较,按照升序或降序的方式整理好手里的牌(构建整个有序...
  • u010349629
  • u010349629
  • 2016-08-04 14:56
  • 1237

带哨兵的插入排序

带有哨兵的插入排序算法的实现
  • ii1245712564
  • ii1245712564
  • 2014-12-22 14:00
  • 3003

“深入理解”—插入排序算法

总结下自己对插入排序的理解。 插入排序算法思想:每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素。 插入排序包括:直接插入排序、二分插入排序以及希尔排序。 选择排序和冒泡排序是相似的,都是有两层循环,逐个比较大小并且移动数据。 1、直接插入排序...
  • qq_25827845
  • qq_25827845
  • 2016-06-21 17:57
  • 2657
    个人资料
    • 访问:3432次
    • 积分:129
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类