思路来自算法导论,貌似有点麻烦 ╮(╯▽╰)╭
类似玩扑克牌时,获得手牌,但是牌序是乱的,因此需要进行排序。
排序方法是:
第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;
}
运行示例: