/*************************************************************************
> File Name: insertion_sort.c
> Author:zhangji
> Mail:mrzhangji@outlook.com
> Created Time: Sun 01 Oct 2023 11:02:26 AM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
void createArrayByRandom(int arr[], int length){
srand(time(0));
for(int i = 0; i < length; i ++){
int n = rand() % 100 + 1;
arr[i] = n;
}
}
void printArray(int arr[], int length){
for(int i = 0; i < length; i ++){
printf("%-5d", arr[i]);
}
putchar('\n');
}
void insertion_sort(int arr[], int length, int sorted_length){
if(sorted_length < length){
int key = arr[sorted_length];
int i;
for(i = sorted_length; i > 0 && key < arr[i-1]; i --){}// 下标从0开始,寻找插入位置
for(int k = sorted_length; k >= i; k--) arr[k] = arr[k-1];
arr[i] = key;
// printArray(arr, length);
insertion_sort(arr, length, sorted_length + 1);
}
}
void insertion_sort_2(int arr[], int length){
for(int sorted_length = 1; sorted_length < length; sorted_length++){
int key = arr[sorted_length];
int i;
for(i = sorted_length; i >0 && key < arr[i - 1]; i--){}
for(int k = sorted_length; k >= i; k --) arr[k] = arr[k - 1];
arr[i] = key;
}
}
int main(){
const int length = 6;
int arr[length];
createArrayByRandom(arr, length);
printf("Before insertion sort: ");
printArray(arr, length);
printf("after insertion sort: ");
insertion_sort(arr, length, 1);
printArray(arr, length);
createArrayByRandom(arr, length);
printf("Before insertion sort_2: ");
printArray(arr, length);
printf("after insertion sort_2: ");
insertion_sort_2(arr, length);
printArray(arr, length);
return 0;
}
对插入排序的优化:不必先确定插入位置,再移动数据;可以在比较的同时移动数据。
void insertion_sort(int arr[], int length, int sorted_length){
if(sorted_length < length){
int key = arr[sorted_length];
int i;
for(i = sorted_length; i > 0 && key < arr[i-1]; i --) arr[i] = arr[i-1]; // 下标从0开始,寻找插入位置
arr[i] = key;
// printArray(arr, length);
insertion_sort(arr, length, sorted_length + 1);
}
}
void insertion_sort_2(int arr[], int length){
for(int sorted_length = 1; sorted_length < length; sorted_length++){
int key = arr[sorted_length];
int i;
for(i = sorted_length; i >0 && key < arr[i - 1]; i--){
arr[i] = arr[i-1];
}
arr[i] = key;
}
}
插入排序算法的比较次数与数组的初始状态有关,当数组为逆序时是最坏情况。
此时需要比较 1 + 2 + ... + n-1 = n(n-1)/2次
当数组顺序时,为最好情况,此时需要比较 n - 1 次。