8、排序

按照某个关键字的值进行排序。


 

不稳定排序

原数据:

  70 30 40 60 30 80 

稳定排序:在前面的数据会一直在前面

  30 30 40 60 70 80 

不稳定排序:在前面的数据,排序后不一定在前面

  30 30 40 60 70 80 


冒泡排序

频繁的比较和交换。它属于稳定排序。C语言嵌套for循环实现冒泡排序

空间复杂度:T(n)=O(n2)

时间复杂度:S(n)=O(1)

快速排序

冒泡排序的升级版,冒泡+分治+递归。它属于不稳定排序。

时间复杂度:

  最坏的情况,取的基准数是最大和最小值:T(n)=O(n2)

  最好的情况,取的基准数是中间值:T(n)=O(nlog2n)

空间复杂度:

  S(n)=O(log2n)

代码实现:

public class KuaiPai {

    public static void main(String[] args) {
        //无序数组
        int[] arr = {12,32,43,12,6,73,67,23};
        System.out.println(Arrays.toString(arr));
        //快速排序
        quickSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    //对外调用的方法:快速排序
    public static void quickSort(int[] arr){
        int low = 0;
        int high = arr.length-1;
        quickSort(arr,low,high);
    }
    //内部使用递归完成排序的方法
    private static void quickSort(int[] arr, int low, int high){
        //当区域长度为1的时候,结束递归排序
        if(low<high) {
            //1、分区:把数组分为两个区域,左边区域的值都小于arr[low],右边区域的值都大于arr[low]
            int index = partition(arr, low, high);
            //2、对左边的区域进行快速排序
            quickSort(arr, low, index - 1);
            //3、对右边的区域进行快速排序
            quickSort(arr, index + 1, high);
        }
    }
    /**
     * 把数组按照“比第一个元素大的数”、“比第一个元素小的数”分为左右两个区域。
     */
    private static int partition(int[] arr, int low, int high){
        //1、确定左指针和右指针
        int i = low;
        int j = high;
        //2、把第一个数作为基准值,取出来
        int x = arr[i];
        //3、实现分区操作,大于基准值的在左边,小于基准值的在右边
        while (i<j){

            //1、从右向左移动j,找到第一个小于基准值的数arr[j]
            while (arr[j]>x && i<j){
                j--;
            }
            //2、把找到的数放入原来基准数的位置arr[i]
            if(i<j){
                arr[i] = arr[j];
                i++;
            }

            //3、从左往右移动i,找到第一个大于基准数x的值arr[i]
            while(arr[i]<x && i<j){
                i++;
            }
            //4、把找到的数放入上次取出来的arr[j]位置上去
            if(i<j){
                arr[j] = arr [i];
                j--;
            }
        }
        //4、把基准值放回去,放分区的中间
        arr[i] = x;
        //5、放回分区的位置
        return i;
    }
}

 

posted @ 2022-12-08 23:14  在博客做笔记的路人甲  阅读(25)  评论(0编辑  收藏  举报