栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

快速、冒泡、选择、插入排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速、冒泡、选择、插入排序

快速排序

先说一下快速排序的主要思路:每一轮排序我们会把数组中的一个数作为基准数,一般会把数组最左边或者最右边的数当作基准数,这里我们把最左边的数当作基准数,基准数确定后,我们会从两边开始进行检索,先从数组的右边检索,检索比基准数小的数,如果检索到了就先停下来,再从左边开始检索比基准数大的数,检索到了也停下来,此时当两边都停下来了,就把这两个位置的数进行交换,交换完成继续检索(当然是先从右边开始,以此类推继续检索),检索时,当左右两边检索到同一位置时,意味着这一轮的排序结束,将此位置的数与基准数交换,此时我们发现数组会有什么特点呢?

以此类推,我们就可以把一组数组的数排序完成。

特点:基准数右边的都是比基准数大的数,基准数左边的都是比基准数小的数。

下面我们通过实例来帮助我们理解快速排序:

这是一个数组{6,1,2,7,9,3,4,5,10,8},我们使用快速排序的方法将他们排好序。

 

 

 

 

 

得到一个排序成功的数组

 程序代码
public class Demo {
    public static void main(String[] args) {
        int[] arr = {6,1,2,7,9,3,4,5,10,8};
        quickSort(arr,0,arr.length -1);

        System.out.println();


    }


    private static void quickSort(int[] arr,int left,int right){
        //left 左指针
        //right 右指针
        //如果数组是空的或者数组长度不大于1或者左指针大于右指针,重叠了
        //if条件如果满足直接返回,程序结束
        if(arr == null || arr.length >= 1 || left >= right){
            return;

        }
        //定义一个key作为中间值,将数组的第一个值赋给key
        int key = arr[left];


        //移动指针的操作
        while(left != right){
            //先移动右指针
            //当右指针大于key的时候和左指针大于右指针的时候
            while (arr[right] >= key && left < right){
                //右指针左移,做--运算
                --right;

            }
            //移动左指针
            while (arr[left] <= key && left < right){
                //左指针右移,做++运算
                ++left;
            }
            //交换两指针中的值
            if(left < right){
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;

            }

        }
        //交换key值和重叠值
        arr[left] = arr[left];
        arr[left] = key;
        //再完成两边递归
        quickSort(arr,left,left-1);
        quickSort(arr,left +1,right);



    }
}
冒泡排序 思路

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

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

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

4)重复步骤1~3,直到排序完成

程序代码
public static void main(String[] args) {
    int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
    // 只需要修改成对应的方法名就可以了
    bubbleSort(array);
​
    System.out.println(Arrays.toString(array));
}
​

public static void bubbleSort(int[] array) {
    if (array == null || array.length <= 1) {
        return;
    }
​
    int length = array.length;
​
    // 外层循环控制比较轮数i
    for (int i = 0; i < length; i++) {
        // 内层循环控制每一轮比较次数,每进行一轮排序都会找出一个较大值
        // (array.length - 1)防止索引越界,(array.length - 1 - i)减少比较次数
        for (int j = 0; j < length - 1 - i; j++) {
            // 前面的数大于后面的数就进行交换
            if (array[j] > array[j + 1]) {
                int temp = array[j + 1];
                array[j + 1] = array[j];
                array[j] = temp;
            }
        }
    }
​
}
选择排序 思路

1)初始状态:无序区为R[1…n],有序区为空;

2)第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

3)n-1趟结束,数组有序化了

程序
public static void main(String[] args) {
    int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
    // 只需要修改成对应的方法名就可以了
    selectionSort(array);
​
    System.out.println(Arrays.toString(array));
}
​

public static void selectionSort(int[] array) {
    if (array == null || array.length <= 1) {
        return;
    }
​
    int length = array.length;
​
    for (int i = 0; i < length - 1; i++) {
        // 保存最小数的索引
        int minIndex = i;
​
        for (int j = i + 1; j < length; j++) {
            // 找到最小的数
            if (array[j] < array[minIndex]) {
                minIndex = j;
            }
        }
​
        // 交换元素位置
        if (i != minIndex) {
            swap(array, minIndex, i);
        }
    }
​
}
​

public static void swap(int[] array, int a, int b) {
    int temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}
插入排序 思路

1)从第一个元素开始,该元素可以认为已经被排序;

2)取出下一个元素,在已经排序的元素序列中从后向前扫描;

3)如果该元素(已排序)大于新元素,将该元素移到下一位置;

4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5)将新元素插入到该位置后;

6)重复步骤2~5。

程序代码
public static void main(String[] args) {
    int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
    // 只需要修改成对应的方法名就可以了
    insertionSort(array);
​
    System.out.println(Arrays.toString(array));
}
​

public static void insertionSort(int[] array) {
    if (array == null || array.length <= 1) {
        return;
    }
​
    int length = array.length;
​
    // 要插入的数
    int insertNum;
​
    for (int i = 1; i < length; i++) {
        insertNum = array[i];
        // 已经排序好的元素个数
        int j = i - 1;
        while (j >= 0 && array[j] > insertNum) {
            // 从后到前循环,将大于insertNum的数向后移动一格
            array[j + 1] = array[j];
            j--;
        }
​
        // 将需要插入的数放在要插入的位置
        array[j + 1] = insertNum;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995308.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号