常用排序算法整理及代码实现
本文对我编写的常用的排序算法进行整理和总结,方便用时进行查阅和参考。
快速排序
快速排序是实际应用中的最好选择,采用了分治法的思想。通过一趟排序将待排序记录分割成独立的两部分,其中一部分的关键字均比另外一部分的小,分别对这两部分记录进行排序,已达到整个有序。
是否稳定:不稳定
时间复杂度:O(nlogn)
空间复杂度:O(logn),需要栈来实现递归用
1 |
|
归并排序
将两个或两个以上的有序表组合成一个新的有序表。合并两个有序表的方法为:比较两个有序表中第一个数,谁小先取谁。继续进行比较,只要有一个有序表为空,直接将另一个有序表取出即可。
是否稳定:稳定
时间复杂度:O(nlogn)
空间复杂度:O(n) (当使用顺序存储时,为了能够实现两个有序表之间的合并),或O(1)(当使用链式存储的时候,不再需要临时的空间来存储排序的结果)
顺序存储代码
以下为采用顺序存储结构的代码:
1 | /** |
链式存储代码
以下为采用链式存储结构的代码,本答案为我在LeetCode上的Sort List 题目的答案,源码放在我的Github上。
1 | struct ListNode { |
直接插入排序
该排序算法的时间复杂度为O(n^2),算法复杂度过高。分为顺序存储和链式存储两种算法,其中顺序存储每比较一个元素是从该元素往前比较的,而链式存储是从链头开始比较的,这点有所不同,造成不同的是由存储结构决定的。
顺序存储代码
1 | #include <stdio.h> |
链式存储代码
以下代码为LeetCode上的链式存储的情况时的直接插入排序算法的代码。
1 | ListNode* insertionSortList(ListNode* head) |