快速排序、堆排序、归并排序

2017-08-15  本文已影响0人  风起天蓝

1.快速排序

快速排序主要是基于分治的思想,每次寻找一个pivot,然后从后往前找比pivot小的,从前往后找比pivot小的。

 public static void quicksort(int[] nums, int low, int high){
        if(low > high)
            return;
        int pivot = nums[low];
        int i = low,j =high;
        while(i<j){
            while(i<j && nums[j]>=pivot){
                j--;
            }
            while (i<j && nums[i]<=pivot){
                i++;
            }
            if(i<j){
                swap(nums, i,j);
            }

        }
        swap(nums, low, i);
        quicksort(nums,low, i-1);
        quicksort(nums,i+1, high);
    }

    public static void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

2.堆排序

堆排序主要分三个步骤

堆调整,比较当前元素及其左右孩子,把最大的调整上来(大顶堆),递归调整。

建堆,根据堆的性质,从nums.length/2-1 最后一个非叶子结点开始从后往前建堆。

排序,从后往前交换堆顶元素和堆最后一个元素,减少堆元素,进行堆的调整。

    public static void adjustHeadp(int[] arrray, int index ,int size){  //堆调整
        int left = 2*index+1;    //下表以0开始
        int right = 2*index+2;
        int largest = index;
        if(left < size && arrray[index]<arrray[left]){
            largest = left;
        }
        if(right < size && arrray[largest]<arrray[right]){
            largest = right;
        }
        if(largest != index){
            swap(arrray, index,largest);
            adjustHeadp(arrray, largest, size);
        }

    }

    public static void buildHeap(int[] arrray){  // 从后往前建堆
        for(int i=arrray.length/2-1;i>=0;i--){
            adjustHeadp(arrray, i, arrray.length);
        }
    }

    public static void sortByHeap(int[] array){   // 排序
        buildHeap(array);
        for(int i=array.length-1;i>=0;i--){
            swap(array, 0, i);
            adjustHeadp(array, 0, i);
        }
    }
  public static void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

3.归并排序

归并排序是一种稳定排序,在归并排序中常见的是二路归并,即讲数组分成两份,各自排序再合并的过程,其中二路归并排序是一个递归的过程,即分割使得数组大小为1或者2为止,这样经过一次比较或者不比较就可以得出一个有序的子序列,代码如下。

public static void mergeSort(int[] array, int left, int right){
        if(left < right){
            int mid = (left+right)/2;
            mergeSort(array, left, mid);
            mergeSort(array, mid+1, right);
            merge(array, left, mid, right);
        }
    }

    public static void merge(int[] array, int left, int mid, int right){
        int[] temp = new int[array.length];
        for(int i=0; i<array.length;i++){
            temp[i] = array[i];
        }
        int i = 0,j = 0, k=0;
        for(i=left,j=mid+1,k=left; i<=mid && j<=right; k++){
            if(temp[i]<=temp[j]){
                array[k] = temp[i++];
            }else{
                array[k] = temp[j++];
            }
        }
        while (i<=mid){
            array[k++] = temp[i++];
        }
        while (j<=right){
            array[k++] = temp[j++];
        }
    }

上一篇 下一篇

猜你喜欢

热点阅读