要说排序算法里面比较简单的,我觉得直接插入排序算是一个。
直接插入排序的原理很简单,就是把一个数字插入到一个有序的数组中。
比如有这么一个数组:
1,3,5,7然后要把 4 插进去。
6 4 5 3 7先把 6 当作一个单独的数组,那么它一定是有序的。
4 6 5 3 7接下来再把 5 插入到4 6这个有序的数组中,过程一样。
4 5 6 3 7循环下去,最终一定会得到一个有序的数组。
#include直接插入排序的效率很低,基本上跟冒泡是一个级别。 问题就出在移动的次数太多。#include #include #define SIZE 100000 void insert_sort(int *a, int size) { int i, j, num; for (i = 1; i < size; i++) { num = a[i]; for (j = i - 1; j >= 0; j--) { if (num < a[j]) { a[j + 1] = a[j]; } else { break; } } a[j + 1] = num; } } int main() { int num, arr[SIZE] = {0}, i; //随机产生数组 srand(time(NULL)); for (i = 0; i < SIZE; i++) { arr[i] = rand() % 100; } insert_sort(arr, SIZE); for (i = 0; i < SIZE; i++) { printf("%d ", arr[i]); } printf(" "); return 0; }
6 4 5 3 7比如 3 这个元素,最终应该放在 6 这个位置上,但是这个过程需要跟每个数字比较并且向后移动。
6 5 7 4 3你会发现,这一次 3 直接和 4 交换了位置,一下子跳了两步。
#include最后来试下 5 万个数据排序,两者的差距肉眼可见。#include #include #define SIZE 100000 void shell_sort(int *a, int size) { int i, j, num, h; for (h = size / 2; h > 0; h /= 2) { for (i = h; i < size; i++) { num = a[i]; for (j = i - h; j >= 0; j = j - h) { if (num < a[j]) { a[j + h] = a[j]; } else { break; } } a[j + h] = num; } } } int main() { int num, arr[SIZE] = {0}, i; //随机产生数组 srand(time(NULL)); for (i = 0; i < SIZE; i++) { arr[i] = rand() % 100; } shell_sort(arr, SIZE); for (i = 0; i < SIZE; i++) { printf("%d ", arr[i]); } printf(" "); return 0; }
root@Turbo:test# time ./insert_sort real 0m1.740s user 0m1.724s sys 0m0.000s root@Turbo:test# time ./shell_sort real 0m0.008s user 0m0.004s sys 0m0.004s root@Turbo:test#
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !