插入排序(Insertion Sort)是一种基于比较的排序算法。它的基本思想是将元素逐个插入到已排序的部分中,使整个序列保持有序。插入排序在处理小数据集或几乎已经有序的数据集时,效率较高。
以下是插入排序的基本实现代码:
#include <stdio.h>
// 插入排序函数
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将arr[i]插入到已排序部分
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
// 打印数组函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
// 主函数
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("未排序的数组: \n");
printArray(arr, n);
insertionSort(arr, n);
printf("排序后的数组: \n");
printArray(arr, n);
return 0;
}
insertionSort
:
key
。key
插入到已排序部分的正确位置。printArray
:
main
:
insertionSort
函数对数组进行排序。虽然插入排序在处理小型数据集时表现良好,但可以通过一些优化方法进一步提高其性能:
减少交换操作:
优化代码示例:
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 使用赋值操作代替交换操作
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
二分查找优化:
优化代码示例:
int binarySearch(int arr[], int item, int low, int high) {
if (high <= low)
return (item > arr[low]) ? (low + 1) : low;
int mid = (low + high) / 2;
if (item == arr[mid])
return mid + 1;
if (item > arr[mid])
return binarySearch(arr, item, mid + 1, high);
return binarySearch(arr, item, low, mid - 1);
}
void insertionSort(int arr[], int n) {
int i, key, j, loc;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 使用二分查找找到插入位置
loc = binarySearch(arr, key, 0, j);
// 移动元素以腾出插入位置
while (j >= loc) {
arr[j + 1] = arr[j];
j--;
}
arr[loc] = key;
}
}
插入排序的时间复杂度在最坏情况下为
,这是因为每次插入都需要比较和移动多个元素。然而,在最好情况下(当数组已经有序时),时间复杂度为
。因此,插入排序在处理几乎有序的数据时效率较高。
插入排序的空间复杂度为
,因为它只需要常数级别的额外空间来存储临时变量。插入排序是一个稳定的排序算法,因为相同元素的相对位置不会改变。
插入排序由于其简单性和高效性,在以下几种情况下非常有用:
插入排序是C语言中一种简单且高效的排序算法,其实现简单且易于理解。通过一些优化方法,可以进一步提高插入排序的性能。在学习和使用插入排序时,了解其优缺点以及适用场景,能够帮助我们更好地选择和使用排序算法。希望本文能帮助读者深入理解插入排序,并在实际编程中灵活应用。