Skip to content

Commit 51cf59e

Browse files
committed
Add file.
1 parent 0778e66 commit 51cf59e

File tree

1 file changed

+308
-0
lines changed

1 file changed

+308
-0
lines changed
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# 十大排序算法总结\n",
8+
"\n",
9+
"\n",
10+
"\n",
11+
"**十大排序算法:**\n",
12+
"\n",
13+
"- 冒泡排序 Bubble Sort [GeeksforGeeks](https://www.geeksforgeeks.org/bubble-sort/),[中文解释](https://sort.hust.cc/1.bubblesort)\n",
14+
"- 选择排序 Selection Sort [GeeksforGeeks](https://www.geeksforgeeks.org/selection-sort/),[中文解释](https://sort.hust.cc/2.selectionsort)\n",
15+
"- 插入排序 Insertion Sort [GeeksforGeeks](https://www.geeksforgeeks.org/insertion-sort/),[中文解释](https://sort.hust.cc/3.insertionsort)\n",
16+
"- 希尔排序 Shell Sort [GeeksforGeeks](https://www.geeksforgeeks.org/shellsort/),[中文解释](https://sort.hust.cc/4.shellsort)\n",
17+
"- 归并排序 Merge Sort [GeeksforGeeks](https://www.geeksforgeeks.org/merge-sort/),[中文解释](https://sort.hust.cc/5.mergesort)\n",
18+
"- 快速排序 Quicksort [GeeksforGeeks](https://www.geeksforgeeks.org/quick-sort/),[中文解释](https://sort.hust.cc/6.quicksort)\n",
19+
"- 堆排序Heapsort [GeeksforGeeks](https://www.geeksforgeeks.org/heap-sort/),[中文解释](https://sort.hust.cc/7.heapsort)\n",
20+
"- 计数排序 Counting Sort [GeeksforGeeks](https://www.geeksforgeeks.org/counting-sort/),[中文解释](https://sort.hust.cc/8.countingsort)\n",
21+
"- 桶排序 Bucket Sort [GeeksforGeeks](https://www.geeksforgeeks.org/bucket-sort-2/),[中文解释](https://sort.hust.cc/9.bucketsort)\n",
22+
"- 基数排序 Radix sort [GeeksforGeeks](https://www.geeksforgeeks.org/radix-sort/),[中文解释](https://sort.hust.cc/10.radixsort)\n",
23+
"\n",
24+
"**参考链接:**\n",
25+
"\n",
26+
"- 各种算法的动画演示:\n",
27+
" - https://www.cs.usfca.edu/~galles/visualization/flash.html\n",
28+
" - https://visualgo.net/en\n",
29+
"- [十大经典排序算法 https://sort.hust.cc/](https://sort.hust.cc/)\n",
30+
"- [十大经典排序算法 https://github.com/hustcc/JS-Sorting-Algorithm](https://github.com/hustcc/JS-Sorting-Algorithm)\n",
31+
"- [[学习笔记] 排序知识点(时间复杂度记忆技巧)](https://fishc.com.cn/thread-121120-1-1.html)\n",
32+
"- [十大经典排序算法动画与解析,看我就够了!(配代码完全版)](https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg)"
33+
]
34+
},
35+
{
36+
"cell_type": "markdown",
37+
"metadata": {},
38+
"source": [
39+
"## 0.介绍\n",
40+
"\n",
41+
"### 0.1 分类:\n",
42+
"\n",
43+
"#### 内部排序和外部排序\n",
44+
"\n",
45+
"内部排序是数据记录在内存中进行排序。\n",
46+
"\n",
47+
"而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。\n",
48+
"\n",
49+
"常见的内部排序算法有:\n",
50+
"\n",
51+
"- 插入排序\n",
52+
"- 希尔排序\n",
53+
"- 选择排序\n",
54+
"- 冒泡排序\n",
55+
"- 归并排序\n",
56+
"- 快速排序\n",
57+
"- 堆排序\n",
58+
"- 基数排序\n",
59+
"\n",
60+
"\n",
61+
"首先解释下算法的稳定性定义:对于待排序列中相同项的原来次序不能被算法改变则称该算法稳定。\n",
62+
"\n",
63+
"![](https://raw.githubusercontent.com/hostimg/img/gh-pages/s/20190824130735.png)\n",
64+
"\n",
65+
"**下面是网上流传很广一张图,的这里的快排的空间复杂度应该为$O(logn)$,最坏情况是$O(n)$,而不是$O(nlogn)$**\n",
66+
"\n",
67+
"![](https://raw.githubusercontent.com/hostimg/img/gh-pages/s/20190901010247.png)"
68+
]
69+
},
70+
{
71+
"cell_type": "markdown",
72+
"metadata": {},
73+
"source": [
74+
"## 1.冒泡排序 Bubble Sort\n",
75+
"\n",
76+
"冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。\n",
77+
"\n",
78+
"作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。\n",
79+
"\n",
80+
"### 1.1 算法步骤\n",
81+
"比较相邻的元素。如果第一个比第二个大,就交换他们两个。\n",
82+
"\n",
83+
"对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。\n",
84+
"\n",
85+
"针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。\n",
86+
"\n",
87+
"**复杂度分析:**\n",
88+
"\n",
89+
"冒泡排序是每次从左边选择一个数据一次与右边数据比较,如果比右边大就交换位置,继续往后比较,那么最好的情况就是序列本身就是升序的,一趟下来比较了n-1次不需要交换结束排序,时间复杂度为O(n);最坏的情况序列本身降序,那么第一次就需要交换n-1次,第二次排序需要交换n-2次,最后一共需要交换$(n-1)+(n-2)+(n-3)+….+1= n(n-1)/2$,所以时间复杂度为$O(n^2)$。\n",
90+
"\n",
91+
"故时间复杂度为$O(n)-O(n^2)$。平均复杂度为$O(n^2)$。\n",
92+
"\n",
93+
"空间复杂度:在交换的时候需要一个外部空间,因此$O(1)$\n",
94+
"\n",
95+
"稳定性:稳定\n",
96+
"### 1.2 python代码实现"
97+
]
98+
},
99+
{
100+
"cell_type": "code",
101+
"execution_count": 1,
102+
"metadata": {},
103+
"outputs": [
104+
{
105+
"name": "stdout",
106+
"output_type": "stream",
107+
"text": [
108+
"11,12,22,25,34,64,90,"
109+
]
110+
}
111+
],
112+
"source": [
113+
"# Python实现冒泡排序\n",
114+
" \n",
115+
"def bubbleSort(arr): \n",
116+
" n = len(arr)\n",
117+
" # 最后n-1个排好后,第一个自然是正确的位置\n",
118+
" for i in range(n-1): \n",
119+
" # 最后i个元素已经排好序\n",
120+
" for j in range(0, n-i-1):\n",
121+
" if arr[j] > arr[j+1]:\n",
122+
" arr[j], arr[j+1] = arr[j+1], arr[j] \n",
123+
" return arr\n",
124+
"\n",
125+
"if __name__ == \"__main__\":\n",
126+
" arr = [64, 34, 25, 12, 22, 11, 90] \n",
127+
" arr = bubbleSort(arr) \n",
128+
" for i in arr:\n",
129+
" print(i,end=',') "
130+
]
131+
},
132+
{
133+
"cell_type": "markdown",
134+
"metadata": {},
135+
"source": [
136+
"### 1.3 优化版本\n",
137+
"\n",
138+
"即使数组已排序,上述函数也始终运行 $O(n^2)$ 时间。如果内部循环没有导致任何交换,则可以通过停止算法来优化它。"
139+
]
140+
},
141+
{
142+
"cell_type": "code",
143+
"execution_count": 2,
144+
"metadata": {},
145+
"outputs": [
146+
{
147+
"name": "stdout",
148+
"output_type": "stream",
149+
"text": [
150+
"11 12 22 25 34 64 90\n"
151+
]
152+
}
153+
],
154+
"source": [
155+
"# Python实现冒泡排序\n",
156+
" \n",
157+
"def bubbleSort(arr): \n",
158+
" n = len(arr)\n",
159+
" # 最后n-1个排好后,第一个自然是正确的位置\n",
160+
" for i in range(n-1): \n",
161+
" swapped = False #记录有没有交换过程\n",
162+
" # 最后i个元素已经排好序\n",
163+
" for j in range(0, n-i-1): \n",
164+
" if arr[j] > arr[j+1]:\n",
165+
" arr[j], arr[j+1] = arr[j+1], arr[j]\n",
166+
" swapped = True\n",
167+
" if swapped == False: \n",
168+
" break\n",
169+
" return arr\n",
170+
"\n",
171+
"if __name__ == \"__main__\":\n",
172+
" arr = [64, 34, 25, 12, 22, 11, 90] \n",
173+
" arr = bubbleSort(arr) \n",
174+
" print(\" \".join([str(i) for i in arr]))"
175+
]
176+
},
177+
{
178+
"cell_type": "markdown",
179+
"metadata": {},
180+
"source": [
181+
"## 2.选择排序 \n",
182+
"\n",
183+
"https://www.geeksforgeeks.org/selection-sort/\n",
184+
"\n",
185+
"## 3.插入排序\n",
186+
"## 4.希尔排序\n",
187+
"## 5.归并排序"
188+
]
189+
},
190+
{
191+
"cell_type": "code",
192+
"execution_count": 3,
193+
"metadata": {},
194+
"outputs": [
195+
{
196+
"name": "stdout",
197+
"output_type": "stream",
198+
"text": [
199+
"original: [1, 4, 2, 3.6, -1, 0, 25, -34, 8, 9, 1, 0]\n",
200+
"Sorted: [-34, -1, 0, 0, 1, 1, 2, 3.6, 4, 8, 9, 25]\n"
201+
]
202+
}
203+
],
204+
"source": [
205+
"# Recursively implementation of Merge Sort\n",
206+
"def merge(left, right):\n",
207+
" result = []\n",
208+
" while left and right:\n",
209+
" if left[0] <= right[0]:\n",
210+
" result.append(left.pop(0))\n",
211+
" else:\n",
212+
" result.append(right.pop(0))\n",
213+
" if left:\n",
214+
" result += left\n",
215+
" if right:\n",
216+
" result += right\n",
217+
" return result\n",
218+
"\n",
219+
"\n",
220+
"def merge_sort(L):\n",
221+
" if len(L) <= 1:\n",
222+
" # When D&C to 1 element, just return it\n",
223+
" return L\n",
224+
" mid = len(L) // 2\n",
225+
" left = L[:mid]\n",
226+
" right = L[mid:]\n",
227+
"\n",
228+
" left = merge_sort(left)\n",
229+
" right = merge_sort(right)\n",
230+
" # conquer sub-problem recursively\n",
231+
" return merge(left, right)\n",
232+
" # return the answer of sub-problem\n",
233+
"\n",
234+
"\n",
235+
"if __name__ == \"__main__\":\n",
236+
" test = [1, 4, 2, 3.6, -1, 0, 25, -34, 8, 9, 1, 0]\n",
237+
" print(\"original:\", test)\n",
238+
" print(\"Sorted:\", merge_sort(test))"
239+
]
240+
},
241+
{
242+
"cell_type": "markdown",
243+
"metadata": {},
244+
"source": [
245+
"## 6.快速排序"
246+
]
247+
},
248+
{
249+
"cell_type": "code",
250+
"execution_count": 4,
251+
"metadata": {},
252+
"outputs": [
253+
{
254+
"name": "stdout",
255+
"output_type": "stream",
256+
"text": [
257+
"[1, 2, 4, 5, 9, 87]\n"
258+
]
259+
}
260+
],
261+
"source": [
262+
"def quicksort(arr):\n",
263+
" if len(arr) < 2:\n",
264+
" return arr\n",
265+
" else:\n",
266+
" provit = arr[0]\n",
267+
" less = [i for i in arr[1:] if i <= provit]\n",
268+
" greater = [i for i in arr[1:] if i > provit]\n",
269+
" return quicksort(less) + [provit] + quicksort(greater)\n",
270+
" \n",
271+
"if __name__ == '__main__':\n",
272+
" arr = [1,5,2,87,4,9]\n",
273+
" print(quicksort(arr=arr))"
274+
]
275+
},
276+
{
277+
"cell_type": "markdown",
278+
"metadata": {},
279+
"source": [
280+
"## 7.堆排序\n",
281+
"## 8.计数排序\n",
282+
"## 9.桶排序\n",
283+
"## 10.基数排序"
284+
]
285+
}
286+
],
287+
"metadata": {
288+
"kernelspec": {
289+
"display_name": "Python 3",
290+
"language": "python",
291+
"name": "python3"
292+
},
293+
"language_info": {
294+
"codemirror_mode": {
295+
"name": "ipython",
296+
"version": 3
297+
},
298+
"file_extension": ".py",
299+
"mimetype": "text/x-python",
300+
"name": "python",
301+
"nbconvert_exporter": "python",
302+
"pygments_lexer": "ipython3",
303+
"version": "3.6.8"
304+
}
305+
},
306+
"nbformat": 4,
307+
"nbformat_minor": 2
308+
}

0 commit comments

Comments
 (0)