Sorting 排序

\To sort small sets of data, bubble sort may be a better option since it can be implemented quickly, but for larger datasets, the speedup from quicksort might be worth the trouble implementing the algorithm.


1. Bubble Sort

像冒泡一样把数字顶上去。

Best case run time: O(n)  如果整个数组本身就拍好序了。 这个O(n)非常confuse我。 因为即便已经sort好的array,每一次pass你不还得判断n-1个相邻的number谁大嘛。

后来发现原来会有一个优化的操作在bubble sort里,用一个变量来知道我们一次pass swap了几次,如果0次,就break for loop。

”Best case in Bubble Sort is when the complete array is sorted. In that case you compare the adjacent element in the first pass and you keep a track of how many swaps you made.

As the complete array is sorted, your number of swaps will be zero. Hence you will break out of the loop. :)“



Worst Case: O(n^2)

Sorting 排序_第1张图片
Sorting 排序_第2张图片

Optimized:


Sorting 排序_第3张图片

2.  Quick Sort

找一个Pivot, 然后把array 分成两个部分around pivot. [比pivot小的全部去left subarray, 比pivot大的全部去right subarray]. 这一步会花这个算法里最多的时间,O(n), 之后就简单了。用递归对left, right array重复一样的步骤。然后我们假设left, right array已经排序好了,这时候只要O(1)时间把他们merge起来就好了。

 找pivot的办法 可以Always Pick first element 或者Always Pick Last Element. 或者Pick a random.

分析类似QuickSort这种递归了好多层的可以用Master Theorem.


on average, the algorithm takesO(nlogn) comparisons to sort items. In the worst case, it makes O(n2) comparisons, though this behavior is rare.

Sorting 排序_第4张图片
Sorting 排序_第5张图片

3. Merge Sort

无论best, worst, average case, 都是O(nlogn)的算法。绝对的NlogN!

Merge Sort跟Quick Sort很像,都是先把array 分成两个部分。 但是不同的是,Merge Sort在分的这个阶段基本不干什么活,【因为不用找pivot一个一个比大小】,干活的主要是merge 的时候。


Sorting 排序_第6张图片

使用Master Theorem: 

Sorting 排序_第7张图片


Sorting 排序_第8张图片

4. Insertion Sort

If the list is almost sorted, then Insertion Sort performs in linear O(n) time

如果整个数组几乎排序好的话,Insertion Sort O(n).

Sorting 排序_第9张图片
Sorting 排序_第10张图片


Selection Sort:  O(n^2)

视频:https://www.youtube.com/watch?v=xWBP4lzkoyM

The selection sort algorithm sorts an array by repeatedly finding the minimum element (considering ascending order)from unsorted part and putting it at the beginning. The algorithm maintains two subarrays in a given array.

Selection sort每次找min都需要scan一遍remaining 的unsorted sections. 

1) The subarray which is already sorted.

2) Remaining subarray which is unsorted.


Sorting 排序_第11张图片


所以既然Insertion Sort 和Selection Sort都是O(N^2), 为什么我们还用?

对于Small array, insertion 和 selection sort 非常快。

Selection Sort比insertion好的地方在于 Selection sort的writes/swaps 比较少。O(n) 因为找n 次min

Insertion Sort 要O(nlogn).

write的比较少,read 多的好处是用在Flash Memory里,write太多减少flash memory 寿命。

Sorting 排序_第12张图片

Bucket Sort

Sorting 排序_第13张图片

counting sort:

https://www.cnblogs.com/dongkuo/p/4832849.html


Sorting 排序_第14张图片


Sorting 排序_第15张图片

你可能感兴趣的:(Sorting 排序)