插入排序:
算法思想:每次将一个待排序的记录根据关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成
顺序查找插入的位置,适用于顺序表、链表
空间复杂度:O(1)
时间复杂度:
- ①最好:原本有序O(n)
- ②最坏:原本逆序O(n^2)
- ③平均:O(n^2)
#include<stdio.h>
#include<stdlib.h>
插入排序(不带哨兵)
//void insertSort(int arr[], int len)
//{
// int i, j, temp;
// for (i = 1; i < len; i++)//将各元素插入到序列中
// {
// if (arr[i] < arr[i - 1])//若arr[i]小于前驱
// {
// temp = arr[i];//用temp暂存arr[i]
// for ( j = i - 1; j >=0 && arr[j] > temp; j--)//检查所有前面已排好序的元素
// {
// arr[j + 1] = arr[j];//所有大于temp的元素都向后移位
// }
// arr[j + 1] = temp;//复制到插入位置
// }
// }
//}
插入排序(带哨兵)
//void insertSort(int arr[], int len)
//{
// int i, j;
// for (i = 2; i < len; i++)//将各元素插入到序列中
// {
// if (arr[i] < arr[i - 1])//若arr[i]小于前驱
// {
// arr[0] = arr[i];//用哨兵位置暂存arr[i]
// for ( j = i - 1; arr[j] > arr[0]; j--)//检查所有前面已排好序的元素
// {
// arr[j + 1] = arr[j];//所有大于temp的元素都向后移位
// }
// arr[j + 1] = arr[0];//复制到插入位置
// }
// }
//}
void insertSort(int arr[], int len)
{
int i, j, temp;
for (i = 1; i < len; i++)
{
if (arr[i] < arr[i - 1])
{
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
void test()
{
int arr[] = { 4,63,7,3,2,4,8 };
int len = sizeof(arr) / sizeof(int);
insertSort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
}
void main()
{
test();
}