直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。
算法
#include "stdafx.h"
using namespace std;
#include<iostream>
#include"stdafx.h"
//用于要排序数组个数最大值,可根据需要修改
#define MAXSIZE 10
typedef struct
{
//用于存储要排序数组,r[0]用作哨兵或临时变量
int r[MAXSIZE + 1];
//用于记录顺序表的长度
int length;
}SqList;
//交换L中数组r的下标为i和j的值
void swap(SqList *L, int i, int j) {
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
//对顺序表L作直接插入排序
void InsertSort(SqList *L) {
int j;
for (int i = 2; i <=L->length; i++) {
//需将L->r[i]插入有序子表
if (L->r[i] < L->r[i - 1]) {
//设置哨兵
L->r[0] = L->r[i];
for (j = i - 1; L->r[j] > L->r[0]; j--) {
//记录后移
L->r[j + 1] = L->r[j];
}
//插入到正确位置
L->r[j + 1] = L->r[0];
}
}
}
#define N 9
int main()
{
int d[N] = { 9,1,5,8,3,7,4,6,2 };
SqList L0;
for (int i = 0; i < N; i++) {
L0.r[i + 1] = d[i];
}
L0.length = N;
cout<< "排序前:";
for (int j = 1; j <= L0.length; j++) {
cout<< L0.r[j];
}
InsertSort(&L0);
cout << "\n直接插入排序后:";
for (int j = 1; j <= L0.length; j++) {
cout << L0.r[j];
}
cout << endl;
return 0;
}
运行结果
直接插入排序复杂度分析
直接插入时间复杂度为:O(n^2)
直接插入排序法比冒泡和简单选择排序的性能要好一些。
算法稳定性
稳定