插入排序

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

类似玩扑克牌时,获得手牌,但是牌序是乱的,因此需要进行排序。
排序方法是:
第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;
}

运行示例:
运行示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值