常见的4种排序方式------冒泡,选择,插入,快速

一.冒泡排序

1.冒泡排序是一种简单的排序算法,它重复地比较相邻的元素,如果顺序错误就交换它们的位置,直到没有相邻元素需要交换,也就是说该元素列已经排序完成.冒泡排序的原理是从左到右,相邻元素进行比较,每次比较一轮,就会找到序列中最大的一个或最小的一个,这个数就会从序列的最右边冒出来,一轮一轮地比较,最后实现排序.冒泡排序的时间复杂度为O(n²),是一种稳定排序算法,可以使用多种编程语言实现.

1.1 算法步骤
相邻的元素两两比较,大的放右边,小的放左边
第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推
如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以

1.2动图演示
在这里插入图片描述
1.3代码示例

import java.util.Random;

public class SortDemo {
    public static void main(String[] args) {
        //生成一个无序数组
        int []arr = new int[100000];
        Random r = new Random();
        for(int i = 0;i < arr.length;i ++){
            arr[i] = r.nextInt();
        }
        //排序前的数组
       // Print(arr);
        //记录排序前的时间
        long time1 = System.currentTimeMillis();
        //冒泡排序,减一是因为最后一轮不需要比较
        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;

                }
            }
        }
        //记录排序后的时间
        long time2 = System.currentTimeMillis();
        //排序所所需的时间
         System.out.println("冒泡排序 100000个数所用时间为:");
        System.out.println(time2 - time1 + "毫秒");
        //排序后的数组
       // Print(arr);

    }

     // 用于打印数组

    public static void Print(int [] arr){
        for(int i = 0;i < arr.length;i ++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

二.选择排序

2.选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

2.1 算法步骤
从0索引开始,跟后面的元素一一比较
小的放前面,大的放后面
第一次循环结束后,最小的数据已经确定
第二次循环从1索引开始以此类推
第三轮循环从2索引开始以此类推
第四轮循环从3索引开始以此类推。

2.2 动图演示
在这里插入图片描述
2.3代码示例

public class SortDemo2 {
    public static void main(String[] args) {
        int arr [] = {2,4,1,9,3,7,6,8,10,0,5};
        //选择排序
        for(int i = 0;i < arr.length;i ++){
            for(int j = i + 1;j < arr.length;j ++){
                if(arr[i] > arr[j] ){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        Print(arr);
    }
    public static void Print(int [] arr){
        for(int i = 0;i < arr.length;i ++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

三.插入排序

3.插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。
插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

3.1 算法步骤
将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。
遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
N的范围:0~最大索引

3.2 动图演示
在这里插入图片描述
3.3代码演示

public class SortDemo3 {
    public static void main(String[] args) {
        int arr [] = {2,4,1,9,3,7,6,8,10,0,5};
        //插入排序
        //找无序排列的第一位数的下标
        int start = -1;
        for(int i = 0;i < arr.length-1;i ++){
            if(arr[i] > arr[i+1]){
                start = i+1;
                break;
            }
        }

        //将无序排列的数插入到有序排列当中
        for(int j = start;j < arr.length;j ++)
            while (j>0&&arr[j]<arr[j-1]){
                int temp = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = temp;
                j--;
            }
        Print(arr);

    }
    public static void Print(int [] arr){
        for(int i = 0;i < arr.length;i ++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

四.快速排序

4.快速排序是由东尼·霍尔所发展的一种排序算法。

快速排序又是一种分而治之思想在排序算法上的典型应用。

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!

它是处理大数据最快的排序算法之一了。

4.1 算法步骤

从数列中挑出一个元素,一般都是左边第一个数字,称为 “基准数”;

创建两个指针,一个从前往后走,一个从后往前走。

先执行后面的指针,找出第一个比基准数小的数字

再执行前面的指针,找出第一个比基准数大的数字

交换两个指针指向的数字

直到两个指针相遇

将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序

4.2 动图演示
在这里插入图片描述
4.3代码演示

import java.util.Random;

public class SortDemo1 {
    public static void main(String[] args) {
        //生成一个无序数组
        int []arr = new int[100000];
        Random r = new Random();
        for(int i = 0;i < arr.length;i ++){
            arr[i] = r.nextInt();
        }
        //排序前的数组
        // Print(arr);
        //记录排序前的时间
        long time1 = System.currentTimeMillis();
        //快速排序
        quicksort(arr, 0, arr.length-1);


        long time2 = System.currentTimeMillis();
        //排序所所需的时间
        System.out.println("快速排序 100000个数所用时间为:");
        System.out.println(time2 - time1 + "毫秒");
        //排序后的数组
         //Print(arr);
    }
    public static void quicksort(int []arr, int i, int j){
        int start = i;
        int end = j;
        //递归的出口
        if(end < start){
            return;
        }
        //定义第一个数为基准数
        int baseNumber = arr[i];

        while (start != end){
            while (true){
                //从后往前找比基准数小的数
                if(baseNumber > arr[end] || end <= start){
                    break;
                }
                end --;
            }
            while (true){
                //从前往后找比基准数大的数
                if(baseNumber < arr[start] || end <= start){
                    break;
                }
                start ++;
            }
            //交换end和start索引的数据
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        //基准数归位
        int temp = arr[i];
        arr[i] = arr[start];
        arr[start] = temp;
        //基准数左边的数重新调用该方法
        quicksort(arr, i, start - 1);
        //基准数右边的数重新调用该方法
        quicksort(arr,start + 1, j);

    }
    public static void Print(int [] arr){
        for(int i = 0;i < arr.length;i ++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

4.4比较其他三种排序,排相同的数据,快速排序所用时间最短。
下面以冒泡排序与快速排序排100000个数所用的时间为例

冒泡排序所用的时间为:
在这里插入图片描述
快速排序所用的时间为:
在这里插入图片描述
对比两张图片,明显看出快速排序比冒泡排序节省了很多时间。

五.小结

在学完这几种排序后感觉有些地方还是不够熟练,因此想借此机会再把这几种排序巩固一下,顺便写一下自己的思路和表达一下自己的想法。希望我的这些感悟能够帮助到各位,谢谢各位的观看。
码字不易,大家的支持就是我坚持的动力。记得点赞哦!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用Java的`Random`类来产生随机数,例如: ``` import java.util.Random; int[] intArr = new int[100]; Random rand = new Random(); for (int i = 0; i < intArr.length; i++) { intArr[i] = rand.nextInt(9999) + 1; } ``` 要使用冒泡升序排序算法对数组进行排序,可以使用以下代码: ``` for (int i = 0; i < intArr.length - 1; i++) { for (int j = 0; j < intArr.length - i - 1; j++) { if (intArr[j] > intArr[j + 1]) { int temp = intArr[j]; intArr[j] = intArr[j + 1]; intArr[j + 1] = temp; } } } ``` 要使用二分法逆序排序算法对数组进行排序,可以使用以下代码: ``` import java.util.Arrays; int[] intArr = new int[100]; Random rand = new Random(); for (int i = 0; i < intArr.length; i++) { intArr[i] = rand.nextInt(9999) + 1; } Arrays.sort(intArr, Collections.reverseOrder()); ``` 请注意,上述代码使用了Java的`Arrays.sort`法和`Collections.reverseOrder`法来实现逆序排序。 ### 回答2: 首先,我们可以使用Java的Random类来生成100个大于等于1,小于10000随机整数,然后将它们存入整数数组intArr[]中。 下面是实现该过程的代码: ```java import java.util.Arrays; import java.util.Random; public class ArraySort { public static void main(String[] args) { int[] intArr = new int[100]; Random random = new Random(); for (int i = 0; i < intArr.length; i++) { intArr[i] = random.nextInt(9999) + 1; } // 冒泡升序排序 bubbleSort(intArr); // 二分法逆序排序 binarySort(intArr); } // 冒泡升序排序算法 public static void bubbleSort(int[] 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; } } } System.out.println("冒泡升序排序结果:" + Arrays.toString(arr)); } // 二分法逆序排序算法 public static void binarySort(int[] arr) { // 先进行升序排序 bubbleSort(arr); // 再逆序排列 for (int i = 0; i < arr.length / 2; i++) { int temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } System.out.println("二分法逆序排序结果:" + Arrays.toString(arr)); } } ``` 以上代码中,我们使用冒泡排序算法对数组进行升序排序,然后将排序后的数组传给二分法逆序排序算法,先进行升序排序,再将结果逆序排列。最后打印出排序结果。 要注意的是,在二分法逆序排序算法中,我们调用了冒泡排序算法来进行升序排序。这是因为在二分法逆序排序中,我们需要先进行升序排序,然后再将结果逆序排列。 ### 回答3: 为了解决这个问题,我们可以用Java编写代码来实现。 首先,我们可以使用Math类的random()法来生成随机整数。我们需要循环100次,每次生成一个介于1到9999之间的随机整数,并将其存储在intArr[]数组中。 ```java int[] intArr = new int[100]; for (int i = 0; i < 100; i++) { intArr[i] = (int) (Math.random() * 9999) + 1; } ``` 接下来,我们使用冒泡排序算法对intArr[]数组进行升序排序冒泡排序算法每次从头开始比较相邻的两个元素,并将较大的元素交换到后面。重复多次比较和交换的过程,直到所有元素都按照升序排列。 ```java for (int i = 0; i < intArr.length - 1; i++) { for (int j = 0; j < intArr.length - i - 1; j++) { if (intArr[j] > intArr[j + 1]) { int temp = intArr[j]; intArr[j] = intArr[j + 1]; intArr[j + 1] = temp; } } } ``` 最后,我们使用二分法逆序排序算法对intArr[]数组进行逆序排序。二分法逆序排序算法是一基于比较的排序法,它通过不断地将待排序序列二分,然后将较大的元素交换到较小的元素前面,从而实现逆序排序。 ```java for (int i = 1; i < intArr.length; i++) { int key = intArr[i]; int low = 0; int high = i - 1; while (low <= high) { int mid = (low + high) / 2; if (key > intArr[mid]) { high = mid - 1; } else { low = mid + 1; } } for (int j = i; j > low; j--) { intArr[j] = intArr[j - 1]; } intArr[low] = key; } ``` 通过以上代码,我们可以生成100个大于等于1、小于10000随机整数,并使用冒泡排序和二分法逆序排序算法对其进行排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值