重温排序算法
因为复试时老师比较喜欢问排序算法那,所以 最近又把排序算法温习一遍,顺便写写代码。
1直接插入排序。
#include <stdio.h> void InsSort(int r[], int n) { int i, j, temp; for(i = 1; i < n; i++) { temp = r[i]; j = i - 1; while(temp < r[j]) //寻找带插入的位置 { r[j+1] = r[j]; j = j - 1; } r[j+1] = temp; //将数值插入已排序的队列中 } } void print(int r[], int n) { int i; for(i = 0; i < n; i++) printf("%d ", r[i]); puts("\n"); } int main() { int a[10] = {3, 1, 5, 2, 7, 8, 9, 4, 6, 0}; printf("before sort:\n"); print(a, 10); InsSort(a, 10); printf("sort after:\n"); print(a, 10); return 0; }
如上述代码:temp变量用于放置带插入数值。
直接插入算法的空间复杂度O(1),因为只用到了1个变量
空间复杂度取决于待排序数列。最好的情况下移动次数 2 * (n-1), 最坏的情况下移动次数(n+4) * (n-1) / 2 , 平均复杂度n^2 / 4,因此时间复杂度位0(n^2)