歸并排序
- 歸并排序圖
歸并排序圖.png
- 遞歸實(shí)現(xiàn)簡介
-
代碼示例
mergesort(left,right,**a){ if(left<right){ int mid = 1/2(left+right); mergesort(left,mid,**a); mergesort(mid+1,right,**a); merge(a,b,left,right); copy(a,b,left,right); } }
-
代碼解釋
-
mergesort
方法是向下分裂的方法 -
merge
是一個(gè)排序方法,對(duì)a中的元素用兩個(gè)指針移動(dòng)進(jìn)行比較存入b中 -
copy
是一個(gè)賦值方法,把b中排序好的值給a
-
-
- 非遞歸實(shí)現(xiàn)簡介
-
代碼示例
void merge_sort(int *list, int length){ int i, left_min, left_max, right_min, right_max, next; int *tmp = (int*)malloc(sizeof(int) * length); for(i=1;i<length;i*=2){ right_min = left_max = left_min+i; right_max = left_max+i; if(right_max>length){ right_max = length; } next = 0; while(left_min<left_max&&right_min<right_max){ tmp[next++] = list[left_min]>list[right_min]?list[right_min++]:list[left_min++]; } while(left_min < left_max){ list[--right_min] = list[--left_max]; } while(next>0){ list[--right_min] = tmp[--next]; } } }
-
算法實(shí)現(xiàn)解釋
- 代碼實(shí)現(xiàn)步驟(按照i=1,2,4依次進(jìn)行,都是相同的,所以只列出i=1的情況)
-
i=1:
left[10],right[4] left_min=0,left_max=1,right_min=1,right_max=2 right_max<length 雙指針移動(dòng)逐步比較直到有一邊到達(dá)尾部 點(diǎn)睛之筆是最后的兩個(gè)while, 第一個(gè)while是判斷當(dāng)left未移動(dòng)到尾部時(shí),將當(dāng)前指針指向的值及之后的移動(dòng)到隊(duì)尾 如果是right未移動(dòng)到尾部,直接將tmp中的值按序賦值到list中即可
-
- 代碼實(shí)現(xiàn)步驟(按照i=1,2,4依次進(jìn)行,都是相同的,所以只列出i=1的情況)
-