点击查看代码
/*
直接插入排序:
假设待排序数组为a[len],初始时默认a[0]为有序区,a[1]~a[len-1]为无序区
每轮将无序区第一个元素作为待插入元素,同时作为本轮排序的比较基准,然后从有序区后往前逐个与有序元素进行比较,寻找插入位置
记i是无序区索引,j是有序区索引,tmp暂存本轮无序区待插入元素(避免在有序区元素后移时将无序区待插入元素覆盖掉)
*/
#include<iostream>
using namespace std;
/*
函数功能:直接插入排序(升序排序)
参数列表:
a[]:待排序数组
n:待排序元素个数
*/
void InsertSort(int a[], int n) {
int i, j, tmp; //i是无序区索引,j是有序区索引,tmp暂存本轮无序区待插入元素
for (i = 1; i < n; i++)//默认a[0]为有序区,因此无序区范围是a[1]~a[n-1]
{
tmp = a[i];//暂存无序区待插入元素(也是本轮排序的比较基准)
j = i - 1;//从有序区后往前比较,则有序区索引为i-1
while (j >= 0 && a[j] > tmp)//从有序区后往前查找小于等于待插入元素temp的位置
{
a[j + 1] = a[j];//如果有序区a[j]大于temp,则将a[j]后移一位
j--;//j减一,继续向前查找
}
//有序区查找完成或遇到小于temp的元素时退出while循环,此时j多减一,因此j+1才是temp的插入位置
a[j+1] = tmp;
}
}
int main() {
int a[] = { 8,7,6,5,4,3,2,1,0 };//待排序列
int n = sizeof(a) / sizeof(a[0]);
cout << "序列个数:" << n << endl;
cout << "排序前:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
InsertSort(a, n); //直接插入排序
cout << "排序后:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}