• 选择排序和冒泡排序


    选择排序

    1、什么是选择排序?

      第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

      选择排序是一种不稳定的排序方法。

    2、什么是算法的稳定性?

      简单来说就是改变了数组中相同值元素本身的排序顺序

      如使用选择排序算法排序,序列3 8 3 2 6,我们知道第一遍选择第1个元素3会和2交换,在之后的排序中两个3不再交换位置,那么原序列中两个3的相对前后顺序就被破坏了,则称选择排序是不稳定的。

    3、时间复杂度和空间复杂度

      需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1) 

      选择排序的时间分析:

      选择排序的交换操作介于 0 和(n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。

      因为无论原数组是否有序,都需要比较,所以时间复杂度为O(n^2)

    4、代码示例

    class Test
    {
        public static void main(String[] args) 
        {
            int[] arr = {1,5,2,0,6,9,12,3,2};
            //选择排序
            selectSortArr(arr);
        }
        /*
            选择排序
        */
        public static void selectSortArr(int[] arr){
            for(int i=0;i<arr.length;i++){
                for(int j=i+1;j<arr.length;j++){
                    //判断
                    if(arr[i]>arr[j]){
                        //完成数组的两个位置的值的交换
                        swap(arr,i,j);
                    }
                };
            }
        
        }
        /*
            数组的两个数值交换
        */
        public static void swap(int[] arr,int i,int j){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
        }

    冒泡排序

    1、什么是冒泡排序?

      排序时就像水中的气泡一样慢慢浮到顶端,所以称为冒泡排序。

    2、算法原理

      比较相邻的元素。如果第一个比第二个大,就交换他们两个。

      对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

      针对所有的元素重复以上的步骤,除了最后一个。

      持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    3、时间复杂度和空间复杂度

      如果原数组为基本排好序的数组,则比较次数为最小值n-1和移动次数最小值0  此时时间复杂度为O(n)

      如果原数组为逆序,则为最坏情况,比较次数为n(n-1)/2,移动次数为3n(n-1)/2  此时时间复杂度为O(n^2)

      所以平均复杂度为O(n^2)

      需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1)

    4、代码示例

    class Test2
    {
        public static void main(String[] args) 
        {
            int[] arr = {2,7,5,3,6,8,9};
            printArr(arr);
            for(int i=0;i<arr.length-1;i++){
                for(int j=0;j<arr.length-1-i;j++){
                    if(arr[j]>arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }
        }
  • 相关阅读:
    唯品会面经
    动态代理两种实现方式
    腾讯运营开发面经
    MySQL一些中重要命令
    金山wps面经
    三七互娱面经
    排序算法之快速排序(Quicksort)解析
    全排列算法分析(原创方法/一般方法/字典序法)
    WinForm如何去掉右边和下边的白边
    Java异常处理机制的秘密
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11147684.html
Copyright © 2020-2023  润新知