冒泡排序和选择排序

和自甴很熟 提交于 2020-03-19 11:22:18

冒泡排序思想:假定n个元素排序,需要进行n-1次比较,每趟比较每两两元素进行比较,每一趟比较取当前未排数据的最大值放在后面.无论原始数据的状态是怎样排的,时间复杂度都为O(N*N).(每一次排序的过程是将当前未排序数据的最大值放在后面)


public class BubbleSort {
    public static void bubbleSort(int[] arr) {
    if(arr == null || arr.length < 2) {
        return ;
    }
    for(int right = arr.length - 1; right > 0; right--) {
        for(int i = 0; i < right; i++)
            if(arr[i] > arr[i+1]) 
                swap(arr, i, i+1);
    }
    }
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    public static void main(String[] args) {
        int[] arr = new int[] {4,1,2,6,3,9,8,7};
        System.out.print("原始数组:");
        for(int i = 0; i < arr.length; i++)
        if(i != arr.length - 1)
            System.out.print(arr[i]+" ");
        else
            System.out.println(arr[i]);
        bubbleSort(arr);
        System.out.print("冒泡排序后:");
        for(int i = 0; i < arr.length; i++)
            System.out.print(arr[i]+" ");
    }
}

运行结果:
冒泡排序和选择排序

选择排序思想:每次假定取i为最小值的下标,然后比较过程中将比i更小的下标记录下来,最后放在未排序数据的前面,无论原始数据的状态是怎样排的,时间复杂度都为O(N*N).(每一次排序的过程是将当前未排序数据的最小值放在前面)


public class SelectSort {
    public static void selectSort(int[] arr) {
        if(arr == null || arr.length < 2)
            return ;
        for(int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for(int j = i + 1; j < arr.length; j++)
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            swap(arr, i, minIndex);
        }
    }
    public static void swap(int[] arr, int i ,int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    public static void main(String[] args) {
        int[] arr = new int[]{55,34,22,566,44,99,43,66};
        System.out.print("原始数组arr:");
        for(int i = 0; i < arr.length; i++)
        if(i != arr.length - 1)
            System.out.print(arr[i]+" ");
        else
            System.out.println(arr[i]);
        selectSort(arr);
        System.out.print("选择排序后:");
        for(int i = 0; i < arr.length; i++)
            if(i != arr.length - 1)
                System.out.print(arr[i]+" ");
            else
                System.out.println(arr[i]);
    }
}

运行结果:
冒泡排序和选择排序

冒泡排序优缺点:优点:比较简单,空间复杂度较低,是稳定的;
缺点:时间复杂度太高,效率慢;
选择排序优缺点:优点:一轮比较只需要换一次位置;
缺点:效率慢,不稳定(举个例子6,8,6,2, 9 第一遍选择元素2和第一个6交换,那么原序列中2个6的相对位置前后顺序就破坏了)。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!