关闭

插入排序

标签: 算法插入排序C++
104人阅读 评论(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网站的观点或立场
    个人资料
    • 访问:2071次
    • 积分:116
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类