版权声明:[email protected] https://blog.csdn.net/qq_271334644/article/details/88327309
排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作
说完排序就要说说稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序这些记录的相对次序保持不变,例如1a,1b在排序完后,顺序依然是1a,1b,则称这种排序算法是稳定的,否则称为不稳定的。
常见的排序算法
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,
时间复杂度:
最好 O(n) (已经有序) | 平均 O(n^2) | 最坏 O(n^2)(已经有序,倒序)
空间复杂度 O(1)
稳定性:稳定, array[j] == key 跳出循环,就保证了稳定性
在 n 比较小的时候 或者 大概率是有序的情况
程序实现
#include<stdio.h>
void InsertSort(int array[], int size) {
// 可以优化成
// for (int i = 1; i < size; i++) {
for (int i = 0; i < size; i++) {
// array[i] 就是要插入的数据,保存到变量中 key
// 从 [0, i) 是已经有序的区间
// 循环的过程 j ~ [i - 1, 0] 依次和 key 比较
// 1. array[j] <= key break
// 2. array[j] > key array[j + 1] = array[j]
// 循环结束后,让 array[j + 1] = key
int key = array[i];
int j;
for (j = i - 1; j >= 0 && array[j] > key; j--) {
array[j + 1] = array[j];
}
array[j + 1] = key;
}
}
int main() {
int array[] = { 3, 9, 1, 4, 7, 8, 3, 5 };
int size = sizeof(array) / sizeof(int);
InsertSort(array, size);
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}