~~~~~~~~~~~~~~~~~还未完成发布点错了~~~~~~~~~~~~~
本文介绍8种常见的排序算法,以及他们的原理,性能分析和c语言实现:
为了方便比对,本文所有的排序全部是升序.
首先准备一个元素无序的数组,一个交换函数,在main函数中实现排序函数的调用,并输出排序结果:
void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int length = sizeof(arr) / sizeof(int); sort(arr, length); for (int i = 0;i < length;i++) { printf("%d\n", arr[i]); } return 0; }
插入排序
第一次排序:
第二次排序:
第三次排序:
外层循环每执行一次就从无序区向有序区中插入一个数据arr[i]
里层循环控制插入的数据arr[i]与其前一个数据比较,如果比前一个数据小,就让前一个数据后移1位
...不断重复上述步骤,直到找到不比arr[i]小的数据arr[j],因为arr[j]后面的数据都后移了1位,所以直接将arr[i]放在空闲的arr[j+1]位置
c程序实现:
void CRsort(int arr[], int length) { int temp; for (int i = 0;i < length;i++) { temp = arr[i]; for (int j = i - 1;j >= 0;j--) { if (arr[j] > temp) { arr[j + 1] = arr[j]; } else { arr[j + 1] = temp; break; } } } }
性能分析
稳定性 : 稳定
-->内层循环执行时,只有遇到大于arr[i]的才会后移,等于arr[i]的不会后移
时间复杂度 : (最坏n²,最好n次,平均n²)
-->数据为n的情况下,外层循环执行n次,内层循环最多执行n次,如果是数据是有序的内层循环只会执行1次,
空间复杂度: 1
参考资料:
1. 《新编数据结构习题与解析》
2. B站视频:https://space.bilibili.com/406692798/channel/detail?cid=67290
3. 博客园
https://www.cnblogs.com/jingmoxukong/p/4302891.html
https://www.cnblogs.com/skywang12345/p/3603935.html
文中的部分图片和设计思路来自以上材料