Java中常用的排序算法(动态演示)

2018-11-27  本文已影响33人  Linhaojian

1.前言


2.复杂度

复杂度.png

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
O(N) : for(int i=0;i<10:i++){};
O(N*N) : for(int i=0;i<10:i++){for(int i=0;i<10:i++){}};
O(log2n) : 就是将循环次数/2;
O(nlog2n) : 就是循环数据的次数1分为2;
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。


3.排序算法

3.1 冒泡

 public static void bubbleSort(int[] numbers)
    {
        int temp = 0;
        int size = numbers.length;
        for(int i = 0 ; i < size-1; i ++)
        {
            for(int j = 0 ;j < size-1-i ; j++)
            {
                if(numbers[j] > numbers[j+1])  //交换两数位置
                {
                    temp = numbers[j];
                    numbers[j] = numbers[j+1];
                    numbers[j+1] = temp;
//                    System.out.println(Arrays.toString(numbers));
                }
            }
//            System.out.println("------------");
        }
    }

3.2 选择

    public static void selectSort(int[] numbers) {
        int size = numbers.length;
        int temp;
        //从零开始向后遍历集合
        for (int i = 0; i < size; i++) {
            //将 i 赋值给k
            int k = i;
            //从集合最后一位开始向前遍历
            for (int j = size - 1; j>i; j--)  {
                //记录比较之后值小的位置
                if (numbers[j] < numbers[k]) {
                    k = j;
                }
            }
            // 将找出最小值与i位置的值交互,把最小值放置在集合最前
            temp = numbers[i];
            numbers[i] = numbers[k];
            numbers[k] = temp;
//            System.out.println(Arrays.toString(array));
        }
    }

3.3 插入

private static void insertSort(int[] numbers) {
        //从1开始递增的遍历数据
        for (int i = 1; i < numbers.length; i++) {
            // 将 i 对应的值 赋予给 temp
            int temp = numbers[i];
            int j;
            // 从 i-1 开始递减的遍历
            for (j = i - 1; j >= 0; j--) {
                //判断temp 是否小于当前j位置的值
                if (temp < numbers[j]) {
                    numbers[j + 1] = numbers[j];
                    System.out.println(Arrays.toString(numbers));
                } else {
                    break;
                }
            }
            numbers[j + 1] = temp;
            System.out.println(j+"  "+Arrays.toString(numbers));
        }
    }

3.4 快速

    public static void quickSortHelp(int[] arr) {
        arr = new int[]{5,3,2,1,4,8,7,9};
        quickSort(arr,0, arr.length-1);
    }
    public static void quickSort(int[] arr,int low, int high) {
        if(low<high) {
            int partition = partition(arr,low,high);
            System.out.println("partition : "+partition+"  low : "+low+"  high : "+high+"  arr : "+Arrays.toString(arr));
            quickSort(arr,low, partition-1);
            quickSort(arr,partition+1, high);
        }
    }
    public static int partition(int[] arr,int low,int high) {
        int base = arr[low]; //用子表的第一个记录做枢轴(分水岭)记录
        System.out.println("base : "+base);
        while(low<high) {
            while(arr[high]>=base&&low<high){
                high--;
            }
            Swap(arr,high,low);
            System.out.println("[high:"+high+"] "+Arrays.toString(arr));
            while(arr[low]<=base&&low<high) {
                low++;
            }
            Swap(arr,high,low);
            System.out.println("[low:"+low+"] "+Arrays.toString(arr));
        }
        System.out.println(Arrays.toString(arr));
        System.out.println("----------------------------");
        return low;
    }
    public static void Swap(int[] arr,int high,int low) {
        int temp = arr[low];
        arr[low] =arr[high];
        arr[high] = temp;
    }

4.总结

欢迎关注linhaojian_CSDN博客或者linhaojian_简书

不定期分享关于安卓开发的干货。


写技术文章初心

  • 技术知识积累
  • 技术知识巩固
  • 技术知识分享
  • 技术知识交流
上一篇 下一篇

猜你喜欢

热点阅读