直接插入排序

点击查看代码
/*
直接插入排序:
假设待排序数组为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;
}


posted @ 2022-09-25 14:06  zhaoo_o  阅读(4)  评论(0编辑  收藏  举报