冒泡,选择,插入,快速四大排序算法详细解析说明

17 篇文章 0 订阅
5 篇文章 0 订阅

前言

首先感谢您的阅览,本篇主要介绍冒泡,选择,插入,快速这基本的四大排序算法的原理,排序流程及代码实现,个人能力有限,只能尽己所能详细阐述,如有不足,欢迎您的补充与指正。也希望小小的笔记能够解决您的困惑问题。


一.冒泡排序

1. 冒泡简介

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。

它重复的遍历过要排序的数列,一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。

这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到最后面。


2. 算法步骤

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

3. 图解流程

下面动图更加方便的解释了排序流程

在这里插入图片描述

动图若不好理解,我又画了详细的流程图

在这里插入图片描述


总结算法注意点

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

4. 代码实现

    public static void main(String[] args) {
        /*
        冒泡排序代码实现
         */
        int[] arr ={2, 4, 5, 3, 1};
        //外循环:表示我要执行多少轮。 如果有n个数据,那么执行n - 1 轮
        for (int i = 0; i < arr.length - 1; i++){
	        //内循环:每一轮中我如何比较数据并找到当前的最大值
            //-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));
    }

二.选择排序

1. 算法步骤

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

2. 图解流程

在这里插入图片描述

在这里插入图片描述

3. 代码实现

 public static void main(String[] args) {
        int[] arr = {2, 4, 5, 3, 1};
        //外循环:几轮
        //i:表示这一轮中,我拿着哪个索引上的数据跟后面的数据进行比较并交换
        for (int i = 0; i < arr.length - 1; i++) {
	        //内循环:每一轮我要干什么事情?
            //拿着i跟i后面的数据进行比较交换
            for (int j = i; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

三.插入排序

1.插入简介

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

插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找


2.算法步骤

将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。

遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

N的范围:0~最大索引


3.流程图解

在这里插入图片描述


4.代码实现

    public static void main(String[] args) {
        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};

        int index = -1;
        //1.找到无序的哪一组数组是从哪个索引开始的
        for (int i = 0; i < arr.length - 1; i++){
            if (arr[i] > arr[i + 1]){
                index = i + 1;
                break;
            }
        }

		//2.遍历从startIndex开始到最后一个元素,依次得到无序的哪一组数据中的每一个元素
        for (int i = index; i < arr.length; i++){
	        //j为记录当前要插入数据的索引
            for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--){
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }

四.快速排序

1.递归算法

递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
使用递归要设置出口,否则会内存溢出
在这里插入图片描述


下面是从1加到100的和,用递归的方式

    public static void main(String[] args) {
        System.out.println(getSum(100));
    }

    private static int getSum(int number) {
        if (number == 1){
            return 1;
        }else {
            number = number + getSum(number - 1);
            return number;
        }
    }

注释: number = 100时,它要用100+调用这个getSum方法,传入99,而99 + getSum这个方法,也是递归要先得到下面的值,最后一直减到1,这次递归的方法得到返回值为1,后面的都有值可以加上去了。


简而言之,就是方法体内又调用了该方法

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

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

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


2.算法步骤

  1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 “基准数”;
  2. 创建两个指针,一个从前往后走,一个从后往前走。
  3. 先执行后面的指针,找出第一个比基准数小的数字
  4. 再执行前面的指针,找出第一个比基准数大的数字
  5. 交换两个指针指向的数字
  6. 直到两个指针相遇
  7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。
  8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。
  9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序

3.流程图解

这个动图配合上面的步骤看的更清晰

在这里插入图片描述

在这里插入图片描述


4.代码实现

快排,效率高,比较重要,22年下半期软考程序员的下午编程题第二大题的第2问,整个就是快排流程,总共9分,您说重要不重要吧。

代码虽然稍许复杂,有点难度,但多看一遍,多揣摩一番,那必然会霍然开朗的

    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.print(Arrays.toString(arr));
    }

    public static void quickSort(int[] arr, int i, int j){
        //定义两个变量记录要查找的范围
        int start = i;
        int end = j;

        //递归出口
        if (start > end){
            return;
        }
        //记录基准数
        int baseNumber = arr[i];
        //利用循环找到要交换的数字
        while (start != end){
            //利用end,从后往前开始找,找比基准数小的数字
            while (true){
                if (end <= start || arr[end] < baseNumber){
                    break;
                }
                end--;
            }
            //利用start,从前往后找,找比基准数大的数字
            while (true){
                if (start >= end || arr[start] > baseNumber){
                    break;
                }
                start++;
            }
            //交互二者位置
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        //当start和end指向了同一个元素的时候,那么上面的循环就会结束
        //表示已经找到了基准数在数组应存入的位置
        //基准数归位
        int temp = arr[i];  //arr[i]仍然是第一个数,基准值
        arr[i] = arr[start]; //这里的start=end,已经到中间位置了
        arr[start] = temp;

        //确定6左边范围,重复刚才第一轮操作
        quickSort(arr, i, start - 1);
        //确定6右边范围,重复刚才第一轮操作
        quickSort(arr, start + 1, j);
    }

下图是程序第一轮运行结果,后面只需要6之前一个范围,6之后一个范围,递归调用即可

在这里插入图片描述


总结

在这里插入图片描述
在这里插入图片描述


最后,感谢您的阅览,愿您能有所收获,能帮助到各位正是文章的价值所在

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您介绍这几种排序算法的 C 语言实现。 1. 冒泡排序算法 冒泡排序是一种简单的排序算法,其基本思想是通过不断交换相邻的元素,将最大或最小的元素逐步“冒泡”到序列的顶部(或底部)。具体实现如下: ``` void bubble_sort(int arr[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序算法 选择排序是一种简单的排序算法,其基本思想是每次从未排序的部分中选出最小的元素,放到已排序的部分的末尾。具体实现如下: ``` void selection_sort(int arr[], int len) { int i, j, min_idx, temp; for (i = 0; i < len - 1; i++) { min_idx = i; for (j = i + 1; j < len; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; } } ``` 3. 插入排序算法 插入排序是一种简单的排序算法,其基本思想是将未排序的元素逐个插入到已排序的部分中,使得已排序的部分仍然有序。具体实现如下: ``` void insertion_sort(int arr[], int len) { int i, j, key; for (i = 1; i < len; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ``` 4. 快速排序算法 快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素都比另一部分小,然后递归地对这两部分继续进行排序。具体实现如下: ``` void quick_sort(int arr[], int left, int right) { if (left >= right) { return; } int i, j, pivot, temp; pivot = arr[left]; i = left; j = right; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } while (i < j && arr[i] <= pivot) { i++; } if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } arr[left] = arr[i]; arr[i] = pivot; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随身携带的笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值