排序算法-理論

1.直接插入排序:想象成給一個已經有序的數組中插入數據,所以只要從後往前找,找到比它小的數字
		插入到它的後邊即可。先取第一個數字,一個數字肯定有序,再取第二個數字,從它的前一個開始找,
		找到比它小的數字,插入到它的後面即可,如果不小於它則把該數字直接插入到當前的位置
                時間複雜度:O(n^2)越有序越快  空間O(1)   穩定性:根據自己的實現。 

2.希爾排序:利用直接插入排序的思想,先將數組分成奇數分,互素,例如5 3 1 。最後一個一定要是1.
            時間複雜度:O(n*log(n))越有序越快  空間O(1)   穩定性:不穩定


3.冒泡: 兩兩相比,把最大的 往後交換。       時間複雜度O(N^2)  空間複雜度O(1)    穩定

4.選擇排序:定義一個Min(保存一趟找到的最小值),Min_index找到最小值的下標.如果最小值的下標和當前不相等,就
	    交換最小值和當前的值。 
                                                        不穩定
            

5.快速排序: 取一個基準,一般取第一個,定義一個low hight。只要low<hight ,從後往前找,找到第一個比基準
	      小的數字,賦值給low的小標,再從前向後找,找到第一個比基準大的數字,賦值給hight下標的值。	
                              遞歸空間複雜度log2(n)   不穩定

		
6.歸併排序:  先讓每個數字爲一組,組內都有序,再兩個兩個爲一組,再4個4個爲一組。最終讓數組完全有序。
	      一次歸併(先保證有兩個歸併段,再保證兩個歸併段都還有數據,low1 low2小的一方賦值給新的數組)
	      當兩個歸併段有一個沒有數據時,將另一個歸併段還存在數據的值賦值給新的數組。接下來是剩下的
	     不夠一個歸併段的數據直接賦值給新的數組即可
                                                         空間O(n)  穩定                     
                    
7.堆排序: 1.一次堆調整:保存起始的數值。從它的左孩子開始,找到它的左右孩子中的較大值,如果較大值
	   大於當前保存的值,將較大值賦值給當前的值。start走到當前空出來的位置,也就是它的左右孩子中
	   的較大值的位置,如果小於,直接跳出,將tmp保存的值,直接賦值給當前的start的位置。
	   
	   第一次建大根堆:從第一個葉子節點的父節點開始,到結尾,i--,循環

	   接下來,每次把頭一個和最後一個交換,把最後一個位置已經固定的數據剔除。

                             不穩定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章