現在把思路整理清楚,過程圖示也畫出來,再把**重新寫一遍,爭取把排序遺留的問題徹底解決
從頭到尾遍歷,找最大的元素的下標,找到之後把最大的元素和最後乙個位置的元素交換
易錯點:
//普通的未經過優化的選擇排序
void
selectsort
(int
* array,
int size)
continue;}
swap
(array[max]
, array[end]);
end--;}
}
將一次選擇乙個最大值變為一次選擇乙個最大值和最小值最大值放在最後面的end位置,最小值放在最前面的begin位置普通選擇排序缺陷:易錯點:
void
selectsortd
(int
* array,
int size)
if(array[index]
< array[minpos])}
//如果minpos在最後的位置,把minpos的位置與maxpos互換即可
if(minpos == end)
swap
(array[begin]
, array[minpos]);
swap
(array[end]
, array[maxpos]);
begin++
; end--;}
}
對一組資料,一直均分到一組只有乙個元素,然後將其歸併,逐步變為有序易錯點:
長短不一時,一方寫完,另一方還未完,直接把另一方直接寫入到後面
void
mergedata
(int
* array,
int left,
int mid,
int right,
int* tmp)
else
}//處理長度不一致的情況
while
(begin1 < end1)
while
(begin2
}
為了方便呼叫,進行一下封裝,其實不封裝也無所謂,那時候還沒學c++所以用malloc,現在自然用new
void
mergesort
(int
* array,
int size)
說真的,我不是很喜歡遞迴的歸併排序**,我覺得memcpy那裡需要加left真的很難理解
void
_mergesort
(int
* array,
int left,
int right,
int* tmp)
}
不加left每次拷貝都會拷貝到左半部分,右半部分永遠是空的
其實應該34一組,291一組,但是看思路就行了,這裡畫的嚴格按照**來說是有問題的
與遞迴不同的是,迴圈不需要先分組了,因為每個元素都是單獨的,可以看作已經分好組了,直接開始歸併
易錯點:
}至此,排序所有的內容基本都搞清楚了,短時間也不太可能會忘,忘了再過來看看就行了,開始新的篇章~
排序 歸併排序和快速排序
1,歸併排序的基本思想 1,將兩個或兩個以上的有序序列合併成乙個新的有序序列,比如有序序列 v 0 v m 和 v m 1 v n 1 合併為 v 0 v n 1 這種歸併方法稱為 2 路歸併 1,必須大於 1 個有序序列 2,必須有序 2,歸併的套路 1,將 3 個有序序列歸併為乙個新的有序序列,...
歸併排序和希爾排序
一 歸併排序 歸併排序的時間複雜度為o nlogn 這是該演算法中最好 最壞和平均的時間效能。其中比較操作的次數介於 nlogn 2和nlogn n 1 在每次歸併中比較次數不一樣 賦值操作的次數是 2nlogn 歸併演算法的空間複雜度為 0 n 歸併排序比較占用記憶體,但卻是一種效率高且穩定的演算...
歸併排序和堆排序
歸併排序的演算法我們通常用遞迴實現,先把待排序區間 s,t 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間 s,t 桶排序法,非常耗空間。規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶的個數,要求待排序陣...