选择排序

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;
                }
            }
        }
    }

 

posted on 2019-07-07 20:57  幸福的小耗子  阅读(209)  评论(0编辑  收藏  举报