publicstaticvoidmergeSortUp(int[] nums){for(int i =0; i < nums.length; i += stepLength *2){int index = i, left = i, right = i + stepLength;while(left < i + stepLength ||(right < i + stepLength *2&& right < nums.length)){if(left < i + stepLength &&(right < i + stepLength *2&& right < nums.length)){if(nums[left]< nums[right]){temp[index]= nums[left];left++;}else{temp[index]= nums[right];right++;}}elseif(left < i + stepLength && left < nums.length){temp[index]= nums[left];left++;}elseif(right < i + stepLength *2&& right < nums.length){temp[index]= nums[right];right++;}else{break;}index++;}}}
while(stepLength /2< nums.length){for(int i =0; i < nums.length; i += stepLength *2){int index = i, left = i, right = i + stepLength;while(left < i + stepLength ||(right < i + stepLength *2&& right < nums.length)){if(left < i + stepLength &&(right < i + stepLength *2&& right < nums.length)){if(nums[left]< nums[right]){temp[index]= nums[left];left++;}else{temp[index]= nums[right];right++;}}elseif(left < i + stepLength && left < nums.length){temp[index]= nums[left];left++;}elseif(right < i + stepLength *2&& right < nums.length){temp[index]= nums[right];right++;}else{break;}index++;}}t = nums;nums = temp;temp = t;stepLength *=2;}
迭代實現歸并排序完整代碼
publicclassMergeSortUpDemo{publicstaticvoidmain(String[] args){int[] nums =newint[]{5,2,1,4,3,2,5,6,1,2,5};int[] temp =newint[nums.length];mergeSortUp(nums);System.out.println(Arrays.toString(nums));}// temp為中間數組,長度和nums一樣的空數組publicstaticvoidmergeSortUp(int[] nums){int[] temp =newint[nums.length];int[] t;int stepLength =2;int tempValue =0;// 以2個元素為單位排序for(int i =0; i < nums.length; i += stepLength){if(i +1< nums.length && nums[i]> nums[i +1]){tempValue = nums[i];nums[i]= nums[i+1];nums[i+1]= tempValue;}}// 將相鄰的兩個塊合并while(stepLength /2< nums.length){// i用來分區for(int i =0; i < nums.length; i += stepLength *2){int index = i, left = i, right = i + stepLength;// 在區內才循環while(left < i + stepLength ||(right < i + stepLength *2&& right < nums.length)){if(left < i + stepLength &&(right < i + stepLength *2&& right < nums.length)){if(nums[left]< nums[right]){temp[index]= nums[left];left++;}else{temp[index]= nums[right];right++;}}elseif(left < i + stepLength && left < nums.length){temp[index]= nums[left];left++;}elseif(right < i + stepLength *2&& right < nums.length){temp[index]= nums[right];right++;}else{break;}index++;}}// 合并一次后的數組為temp,將nums設為合并后的數組,然后在temp數組里面再次合并t = nums;nums = temp;temp = t;stepLength *=2;}}}