插入排序算法思想:假设手上又一把未经排序的扑克牌(总数设为N),需要将之从小到大排序。则先从牌的左面开始整理,第二张与第一张进行比较,并将前两张大小顺序排列好。排列第三张时,第三张先与第二张比较,若大则插入第二张之后(也就是不动),若小则与第一张比较,若大则插在第一和第二之间,若小则插第一张之前,如此,前三张大小顺序排列完毕。以此类推,在排列第n张之前,其前面的n-1张牌顺序必定已经从小到大排列。
插入排序实现过程:
插入排序代码实现:
#include<iostream>
#define SIZE 5
using namespace std;
typedef struct{
int text_num;
char text_char;
}TEXT;
void Move(TEXT *b, int p, int q){//只是套用之前冒泡和选择时需要用的Swap函数,其实不需要申请temp的,b[q]数据是不需要保留的,直接把b[p]扔到b[q]就好了
TEXT temp;
temp.text_num=b[p].text_num;
b[p].text_num=b[q].text_num;
b[q].text_num=temp.text_num;
temp.text_char=b[p].text_char;
b[p].text_char=b[q].text_char;
b[q].text_char=temp.text_char;
}
void Insertion_Sort(TEXT *a){
int i, j;
for(i=0;i<SIZE;i++){
TEXT temp=a[i];
for(j=i-1;j>=0&&a[i].text_num<a[j].text_num;j--){
Move(a,j,j+1);
}
a[++j]=temp;
}
}
void show(TEXT *a){
cout << "排序后的数字及字符为:" << endl;
for(int i=0;i<SIZE;i++){
cout << a[i].text_num << " " << a[i].text_char << endl;
}
}
int main(){
TEXT text[SIZE];
cout << "请输入数字及字符,输入格式为\"数字 字符\",输入后请回车" << endl;
for(int i=0;i<SIZE;i++){
cin >> text[i].text_num >> text[i].text_char;
}
Insertion_Sort(text);
show(text);
return 0;
}
运行结果:
稳定性:
由运行结果可知,三个2的身份为a、c、e,经过排序后,三个2的身份依然为a、c、e,故插入排序为稳定排序,当然可增加本例中SIZE值,会更具说服力。
需要注意的是,第27行中,a[i].text_num<a[j].text_num中的‘<’若改为‘<=’,则该插入排序将为不稳定的,理由很简单,比如上图的身份为e的2,在与身份为a和c的2的比较过程中,是满足小于等于条件的,所以身份为e的2会被插入到身份为a、c的2的前面
本文详细介绍了插入排序算法的思想及其实现过程,通过扑克牌排序的例子来解释排序步骤,并提供了一个C++代码示例,演示如何对结构体数组进行排序。此外,还讨论了插入排序的稳定性。
1849

被折叠的 条评论
为什么被折叠?



