QuickSort 和 MergeSort

来源:互联网 发布:windos系统mac怎么 编辑:程序博客网 时间:2024/06/11 02:49

1. QuickSort
先整体有序再局部有序

      int left = start, right = end;        // key point 1: pivot is the value, not the index        int pivot = A[(start + end) / 2];        // key point 2: every time you compare left & right, it should be         // left <= right not left < right        // partition        while (left <= right) {            while (left <= right && A[left] < pivot) {                left++;            }            while (left <= right && A[right] > pivot) {                right--;            }            // 交换            if (left <= right) {                int temp = A[left];                A[left] = A[right];                A[right] = temp;                left++;                right--;            }        }        // recursive        // 此时left已经全部在pivot右边,right已经全部在pivot左边        quickSort(A, start, right);        quickSort(A, left, end);
  1. MergeSort
    先左右 分别recursive 再merge two
public void sortIntegers2(int[] A) {        // Write your code here        if(A == null || A.length == 0) {            return;        }        int[] temp = new int[A.length];        mergeSort(A, 0, A.length - 1, temp);    }    private void mergeSort(int[] A, int start, int end, int[] temp) {        if(start >= end) {            return;        }        int middle = (start + end) / 2;        mergeSort(A, start, middle, temp);        mergeSort(A, middle + 1, end, temp);        merge(A, start, end, temp);    }    // merge two sorted array    private void merge(int[] A, int start, int end, int[] temp) {        int middle = (start + end) / 2;        int leftIndex = start;        int rightIndex = middle + 1;        int index = leftIndex;        while(leftIndex <= middle && rightIndex <= end) {            if(A[leftIndex] <= A[rightIndex]) {                temp[index++] = A[leftIndex++];            } else {                temp[index++] = A[rightIndex++];            }        }        // 可能有一边没有结束        while(leftIndex <= middle) {            temp[index++] = A[leftIndex++];        }        while(rightIndex <= end) {            temp[index++] = A[rightIndex++];        }        // copy temp        for(int i = start; i <= end; i++) {            A[i] = temp[i];        }    }