剑指offer刷完了,是时候总结一波数据结构与算法了。本系列文章暂定包括数据结构中树和图的各种操作,以及查找、排序等基本算法和动态规划等高级算法。本系列文章只是作为总结性的文献,为自己日后的面试做准备。
直接引自维基百科:排序算法。总结性强。
在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜索算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字数据以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则:
虽然排序算法是一个简单的问题,但是从计算机科学发展以来,在此问题上已经有大量的研究。举例而言,冒泡排序在1956年就已经被研究。虽然大部分人认为这是一个已经被解决的问题,有用的新算法仍在不断的被发明。(例子:图书馆排序在2004年被发表)
在计算机科学所使用的排序算法通常被分类为:
当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4, 1) (3, 1) (3, 7)(5, 6)
在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有:
(3, 1) (3, 7) (4, 1) (5, 6) (维持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。实现的一个方式是人工扩充键值的比较(比如上面的比较中加入第二个标准:第二个键值的大小),从而在键值相同的两个对象之间进行比较时,使用在原先数据次序中的条目。然而,要记录这种次序通常牵涉到额外的空间负担。
在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。
==概述到此结束,下面分八篇文章依次对典型的八种排序进行图文并茂的讲解和c++实现。==
先贴一下八大排序的性能概括图:
再贴出来以后要用到的main函数和头文件。
#include
#include
#include
#include
#include
#include
using namespace std;
#define M 5
int main() {
int arr[] = {2,4,6,8,9,7,5,3,1};
int len = sizeof(arr) / sizeof(*arr);
// double arr[] = {4.5, 2.3,6.7, 3.5, 1.1};
// const int len = sizeof(arr) / sizeof(arr[0]);
// BubbleSort(arr, len);
// BubbleSort1(arr, len);
// BubbleSort2(arr, len);
// BubbleSort3(arr, len);
// InsertSort(arr, len);
// ShellSort(arr, len);
// QuickSort(arr, len);
// QuickSortIteration(arr, len);
// SelectSort(arr, len);
// HeapSort(arr, len);
// MergeSort(arr, len);
MergeSortIteration(arr, len);
for(auto v : arr){
cout << v << " ";
} cout << endl;
}
最后就要打开传送门了:
csdn告诉我今天上传博客的次数到达上限了,然而我还有两个没有上传,那我只好先引流到我的个人博客了。
参考链接:
维基百科
数据结构与算法可视化可视化
数据结构与算法
排序算法可视化
经典排序算法总结与实现