插入排序

来源:互联网 发布:淘宝人肉一个人多钱 编辑:程序博客网 时间:2024/06/05 10:31

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

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