c语言——直接插入排序
插入排序就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列。
哪里有一个排好序的序列
那问题是我们要排序的是一个数组,哪里来一个排好序的序列呢?这时,我们可以把数组下标为0的元素想像成一个有序的数组,这个数组内只有他一个元素,所以,它总是有序的。后面的元素和他比较。
以升序为例
升序
//升序
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp < arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
运行,
4 2 8 0 5 7 1 3 9
0 1 2 3 4 5 7 8 9
降序
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp > arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
运行
4 2 8 0 5 7 1 3 9
9 8 7 5 4 3 2 1 0
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void printArray(int arr[],int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp > arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
void test()
{
int arr[] = { 5, 3, 9, 2, 1, 3 };
int len = sizeof(arr) / sizeof(int);
printArray(arr, len);
InsertSort(arr, len);
printArray(arr, len);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
时间复杂度
空间复杂度
直接插入排序中只使用了i,j,tmp这三个辅助元素,与问题规模无关,空间复杂度为 O(1) \textit{O(1)} O(1)。
是否是稳定排序
相同元素的相对位置不变,如果两个元素相同,插入元素放在相同元素后面。是一种稳定排序。