一。 归并排序
O(nlogn)的时间复杂度的排序方法中,稳定的只有归并排序,堆排序和快速排序都是不稳定的。
在数组长度比较短的情况下,不进行递归,而是选择其他的排序方案,比如插入排序。
/** * Algorithm of mergeSort * @param nums */ public void mergeSort(int[] nums) { mergeSortHelp(nums, 0, nums.length-1); } public void mergeSortHelp(int[] nums, int low, int high) { if(low >= high) return; int mid = (low + high) / 2; mergeSortHelp(nums, low, mid); mergeSortHelp(nums, mid+1, high); merge(nums, low, mid, high); } public void merge(int[] nums, int low, int mid, int high) { int[] copy = new int[nums.length]; int s1 = low, s2 = mid+1; int t = low; //the index of copy while(s1 <= mid && s2 <= high) { if(nums[s1] <= nums[s2]) copy[t++] = nums[s1++]; else copy[t++] = nums[s2++]; } while(s1 <= mid) copy[t++] = nums[s1++]; while(s2 <= high) copy[t++] = nums[s2++]; for(int i=low; i<=high; i++) nums[i] = copy[i]; }
二。 外排序(External sorting)
- 外排序是指处理超过内存限制的数据的排序算法。通常是讲中间结果放在读写较慢的外存储器(一般是硬盘)上;
- 一般采取的策略是“排序-归并”策略:
- 排序阶段,读入能放在内存中的数据量,将其排序输出带临时文件,一次进行,将待排序数据组织为多个有序的临时文件;
- 归并阶段,将这些临时文件组合为大的有序文件。
- 如,使用100M的内存对900M的数据进行排序:
- 读入100M的数据至内存,用常规方式(如堆排序)进行排序;
- 将排序后的数据写入硬盘;
- 重复两个步骤,得到9个100M的块中;
- 将100M的内存划分为10份,前9份为输入缓冲区,第10份为输出缓冲区。如前9分各8M,第10份18M;
- 执行九路归并算法,将结果输出到输出缓冲区:
- 若输出缓冲区满,将数据写至目标文件,并清空缓冲区;
- 若输入缓冲区空,则读入相应文件的下一份数据。
---恢复内容结束---