排序与搜索一览

 一。 归并排序

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;
      • 执行九路归并算法,将结果输出到输出缓冲区:
        • 若输出缓冲区满,将数据写至目标文件,并清空缓冲区;
        • 若输入缓冲区空,则读入相应文件的下一份数据。

---恢复内容结束---

原文地址:https://www.cnblogs.com/little-YTMM/p/5515515.html