zoukankan      html  css  js  c++  java
  • 选择排序和冒泡排序

    选择排序

    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;
                    }
                }
            }
        }
  • 相关阅读:
    49. 字母异位词分组
    73. 矩阵置零
    Razor语法问题(foreach里面嵌套if)
    多线程问题
    Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data
    How to execute tons of tasks parallelly with TPL method?
    How to sort the dictionary by the value field
    How to customize the console applicaton
    What is the difference for delete/truncate/drop
    How to call C/C++ sytle function from C# solution?
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11147684.html
Copyright © 2011-2022 走看看