排序算法(快速排序,冒泡排序,插入排序,堆排序)

  • 冒泡排序

不多说就是两趟循环,第一趟从头到尾,第二趟从尾到i找到最大或者最小放到i处完成内部一次循环

    public void bubblesort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = arr.length - 1; j > i; j--) {
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
    }
  • 插入排序

插入排序认为我之前都是拍好的顺序,只要插入到之前拍好的序列中即可。

    public void insertSort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            if (a[i] < a[i - 1]) {
                //记录需要插入的值
                int index = i - 1;
                int temp = a[i];
                //遍历之前已经拍好的序列,后移比temp大的值,为该值留出空间。
                while (index >= 0 && temp < a[index]) {
                    a[index + 1] = a[index];
                    index--;
                }
                a[index + 1] = temp;
            }
        }

    }
  • 快速排序
    主要是那个partition函数,一次快速排序都是在该函数中进行的,作用是把比该数大的放在该数后面,比该数小的数放在该数后面,并返回该数的最后位置。
    public void quickSort(int[] arr, int low, int high){
        if(low<high){
            int index = partition(arr, low, high);
            quickSort(arr, low, index-1);
            quickSort(arr, index+1, high);
        }
    }

    public int  partition(int[] arr, int x, int y){
        int temp = arr[x];
        while(x<y){
            while(x<y && temp<arr[y]){
                y--;
            }
            change(arr,x,y);
            while(x<y && temp>arr[x]){
                x++;
            }
            //交换两个数
            change(arr,x,y);
        }
        return x;
    }
    public void change(int[] arr, int i, int j ){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
  • 堆排序
    在堆排序中,是利用一个数组来存放一个堆的。如果是按照数组从0开始排序,则对于序号为i的节点,其左节点序号为i*2+1,右节点的序号为i*2+2,对堆的操作就是利用该规则。
    其中主要函数为heapAdjust:其作用是,左右子树都是大顶堆或者小顶堆,顶部为需要调整的节点,调整该节点。利用while循环从头向下调整。

堆排序有两步
1. 建堆过程
从最后一个非叶子节点开始利用 heapAdjust函数进行排序。
2. 排序过程
把建立好的堆,将第一个与堆最后一个替换,缩小堆,利用heapAdjust调整堆,最后得到拍好序的数组。

    public void heapSort(int[] arr){
        buildHeap(arr);
        for(int i =  arr.length-1;i>0;i--){
            change(arr,0,i);
            heapAdjust(arr,0,i);
        }
    }

    public void buildHeap(int[] arr){
        int index = arr.length/2;
        for(int i = index;i>=0;i--){
            heapAdjust(arr, i, arr.length);
        }
    }

    public void heapAdjust(int[] arr, int index, int length){
        int large = 0;
        while((index*2+1) < length){
            if(arr[index] > arr[2*index+2] && arr[index]> arr[index*2+1]){
                break;
            }
            large = arr[index] < arr[index*2+1] ? (index*2+1) : index;
            //判断是否存在右子树
            if(index*2+2 < length)
                large = arr[large] < arr[index*2+2] ? (index*2+2):large;
            change(arr,index,large);
            index = large;
        }
    }

    public void change(int[] arr, int i, int j ){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    原文作者:排序算法
    原文地址: https://blog.csdn.net/xiaoxiaosu3/article/details/51384920
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞