图解Java经典算法冒泡选择插入希尔排序的原理与实现

目录
  • 一、冒泡排序
    • 1、基本介绍
    • 2、代码实现
  • 二、 选择排序
    • 1、基本介绍
    • 2、代码实现
  • 三、插入排序
    • 1、基本介绍
    • 2、代码实现
  • 四、希尔排序
    • 1、基本介绍
    • 2、代码实现(交换排序)
    • 3、代码实现(移位排序)

一、冒泡排序

1、基本介绍

冒泡排序是重复地走访要排序的元素,依次比较两个相邻的元素,如果它们的顺序与自己规定的不符合,则把两个元素的位置交换。走访元素重复地进行,直到没有相邻元素需要交换为止,完成整个排序过程。

算法原理

1、比较相邻元素,如果前一个元素大于后一个元素,则交换。

2、依次向后对每一对相邻元素做同样的工作,直到队列末尾,第一轮过后最大的元素就位于最后一个元素位置了。

3、重复以上步骤,直到最后一个元素位置的前一位为止(因为最后一位已经排了)。

4、持续每次对越来越少的元素重复上面步骤,直到第一个元素和第二个元素交换后顺序为从大到小或从小到大,排序结束。

2、代码实现

冒泡排序实际上就是两个数两个数的比较,每循环一次将最大或最小的数放在最后,剩下的就继续两两比较。

public static void bubbleSort(int[] arr){
        //中间变量,用来交换数据
        int temp = 0;
        //外层循环
        for (int i = 0 ; i < arr.length - 1 ; i++){
            //内层循环,每次找到最大的数后放在最后,下次遍历则会少一次,及arr.length - i - 1
            for(int j = 0; j < arr.length - i - 1; j++){
                //判断大小
                if(arr[j] > arr[j + 1]){
                    //将两数进行交换
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
}

二、 选择排序

1、基本介绍

首先第一次确定第一个数为最小的,然后利用for循环,将第一个数后的数据遍历一遍,找是否还有比第一个数更小的,记录下来,遍历完毕后将第一个数与最小的数进行交换。然后又确定第二数,找第二个数以后的数,是否还有比第二个数更小的,找到后与第二个数又进行交换,重复上面即可。

以后的每次循环都是按照这种方式,直到最后两个数排完,数据就是有序的了。

2、代码实现

public static void choiceSort(int[] arr){
        //用来记录最小的数
        int arrData = 0;
        //记录最小的数的下标
        int arrindx = 0;
        //外层循环,直到 arr.length - 1 即可
        for(int i = 0; i < arr.length - 1; i++){
            //首先把arr[i] 当做最小的数,并记录下标
            arrData = arr[i];
            arrindx = i;
            //内层循环,遍历 i 以后的数,找到比 arr[i] 还小的数
            for (int j = i + 1; j < arr.length; j++){
                //找到更小的数,就进行记录
                if(arrData > arr[j]){
                    arrData = arr[j];
                    arrindx = j;
                }
            }
            //循环完毕,说明找到了,最小的数,与arr[i] 进行交换即可
            arr[arrindx] = arr[i];
            arr[i] = arrData;
        }
}

三、插入排序

1、基本介绍

前面我们介绍的选择排序,找到最小的就与前面的进行交换。而插入排序,就是将确定的数的后一位插入到前面即可。图形介绍:

开始,id指向第一个数,mid指向第二个数,然后两个数进行比较。

此时,1 比 3 小,但是3前面没数据了,于是将1插入到3的前面,注意这里是插入,不是交换。下一步 3 比 5 小,于是不用插入。

经过三次比较,确定了 2 的位置在 1 和 3 直接,直接将 2 插入。

又经过四次比较,找到 0 的位置 在 1 的前面,于是将 0 插入到 1 的前面即可。

2、代码实现

 public static void insertSort(int[] arr){
        //下标为 0 的数是确定的,从下标为 1 开始循环
        for (int i = 1; i < arr.length; i++){
            // 将下标为 i 的数暂存起来
            int arrData = arr[i];
            //从 i - 1 开始往前循环
            int arrIndx = i - 1;
            //判断退出的条件 大于等于0
            while (arrIndx >= 0){
                //如果arrData 大于 下标为arrIndx 的数,则位置找到,退出循环
                if (arrData > arr[arrIndx]){
                    break;
                }
                //没有找到,就将前面的数往后移
                arr[arrIndx + 1] = arr[arrIndx];
                arrIndx--;
            }
            //找到位置后,就将暂存的数据arrData 插入到下标为arrIndx的位置
            arr[arrIndx + 1] = arrData;
        }
    }

四、希尔排序

1、基本介绍

首先将数组分为两组,3、2、0 为一组,1、5为一组,g = arr.length / 2。

2 和 3 进行判断,3 比 2 大 ,然后进行交换位置,交换后 j = j- g< 0(因为第一次的分为两组,所以 i - 2)。所以 i++ ,j = i - g

不需要交换, 然后 j = j- g < 0 ,所以 i++ ,j = i - g

3 比 0 大 ,需要交换。然后 j = j - g > 0 , j = j - g

交换后 j = j - g < 0 , i++ > arr.length 了,第一轮结束

第二轮:在arr.length / 2的基础上再除2 , 于是 g = 1 ;

然后两两交换,交换后 进行j = j - g > 0 的判断 ,不成立则 i++, j = i - g ,成立则 j = j - g ,就这样一直循环下去。第二轮后的结果:

第二轮结束后,g / 2 = 0 结果不大于 0,所以排序结束

2、代码实现(交换排序)

    public static void shellSort_exchange(int[] arr){
        //做中间变量,进行数据交换
        int temp = 0;
        // g 首先数组总长除以2, 然后每次除以2
        for(int g = arr.length / 2 ; g > 0 ; g /= 2){
            // i 从 g 的位置开始遍历
            for(int i = g ; i < arr.length ; i++){
                // j 从 i - g 的位置开始向前遍历,j 的位置由 j - g 来决定
                for(int j = i - g ; j >= 0 ; j -= g){
                    //判断 下标(j + g) 和 下标j 位置的数的大小,然后进行交换
                    if(arr[j + g] < arr[j]){
                        //交换即可
                        temp = arr[j + g];
                        arr[j + g] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
        }
    }

3、代码实现(移位排序)

移位排序的思想与前面的交换排序一样的,只是在交换数的方式上有变化。交换排序数的交换方式来自冒泡排序,而移位排序数的交换方式来自插入排序。

    public static void test1(int[] arr){
        //与前面一样,开始数组长度除以2 , 然后每次除以2
        for(int g = arr.length / 2 ; g > 0 ; g /= 2){
            // i 从 g 位置开始,每次加一
            for(int i = g ; i < arr.length ; i++){
                //定义 j 的位置 为 i
                int j = i ;
                //将 下标为 i 位置的数暂存起来
                int temp = arr[i];
                //判断 下标j位置的数 和 j - g 位置的数,与前面一样
                if(arr[j] < arr[j - g] ){
                    //遍历循环
                    while(j - g >= 0 && temp < arr[j - g]){
                        //满足条件,就移位,将前面的数 (下标j - g) 往后移 (下标j)
                        arr[j] = arr[j - g];
                        j -= g;// j 每次 -g
                    }
                }
                //退出循环或判断条件后,将暂存的temp (arr[i]) 赋值给 arr[j]
                arr[j] = temp;
            }
        }
    }

到此这篇关于图解Java经典算法冒泡选择插入希尔排序的原理与实现的文章就介绍到这了,更多相关Java冒泡排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import java.util.Arrays; /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ public class EightAlgorithms { //插入排序:时间复杂度o(n^2) p

  • Java轻松入门冒泡 选择 插入 希尔 归并排序算法

    今天我们主要看一些简单的排序 常见的时间复杂度 常数阶Ο(1) 对数阶Ο(log2n) 线性阶Ο(n) 线性对数阶Ο(nlog2n) 平方阶Ο(n²) 立方阶Ο(n³) K次方阶Ο(n^k) 指数阶Ο(2^n) 常见的时间复杂度对应图 Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n²)<Ο(n³)<…<Ο(2^n) <Ο(n!)<O(n^n) 冒泡排序(Quicksort) 算法描述: ①. 比较相邻的元素.如果第一个比第二个大,就交

  • 图解Java经典算法冒泡选择插入希尔排序的原理与实现

    目录 一.冒泡排序 1.基本介绍 2.代码实现 二. 选择排序 1.基本介绍 2.代码实现 三.插入排序 1.基本介绍 2.代码实现 四.希尔排序 1.基本介绍 2.代码实现(交换排序) 3.代码实现(移位排序) 一.冒泡排序 1.基本介绍 冒泡排序是重复地走访要排序的元素,依次比较两个相邻的元素,如果它们的顺序与自己规定的不符合,则把两个元素的位置交换.走访元素重复地进行,直到没有相邻元素需要交换为止,完成整个排序过程. 算法原理 1.比较相邻元素,如果前一个元素大于后一个元素,则交换. 2.

  • 图解Java经典算法希尔排序的原理与实现

    目录 希尔排序 算法思想 图解 代码实现(Java) 希尔排序 希尔排序时插入排序的一种,也称缩小增量排序,是直接插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 算法思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的数越来越多当增量减至1时,整个序列恰好被分成一组,算法完成. 我们以增序排序为例,希尔排序基本步骤:选择初始增量gap=length/2,缩小增量继续以gap=gap/2的方式进行,直到增量gap=1为止,增量的每次变

  • 图解Java经典算法插入排序的原理与实现

    目录 一.算法介绍 二.算法思想 三.算法原理 四.动图演示 五.代码实现 六.算法分析 6.1 时间复杂度 6.2 空间复杂度 一.算法介绍 插入排序,也称为直接插入排序.插入排序是简单排序中效率最好的一种,它也是学习其他高级排序的基础,比如希尔排序/快速排序,所以非常重要,而它相对于选择排序的优点就在于比较次数几乎是少了一半. 二.算法思想 每次将待排序的元素插入到已排序的序列中,直至全部插入完成. 三.算法原理 把所有元素分为两个序列,将第一待排序序列第一个元素看做一个有序序列,把第二个元

  • 图解Java经典算法归并排序的原理与实现

    目录 归并排序 算法原理 动图演示 代码实现 复杂度 归并排序 归并排序主要分成两部分实现,分.合两部分,分是把数组分成两半,再递归的对子数组进行 分 操作,直到分成一个个单独的数.合是把两个数组合并为有序数组,在对有序数组进行合并,直到全部子数组合并为一个完整的数组. 算法原理 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤c直

  • 图解Java经典算法快速排序的原理与实现

    目录 快速排序 算法原理 图解 Java代码实现 算法分析 快速排序 通过一趟排序将待排元素分成独立的两部分,其中一部分为比基准数小的元素,另一部分则是比基准数大的元素.然后对这两部分元素再按照前面的算法进行排序,直到每一部分的元素都只剩下一个. 本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法. 算法原理 从数列中挑出一个元素作为基准点 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 然后基准值左右两边,重复上述步骤 通过递归把基准值元素左右两侧的

  • 详解Python排序算法的实现(冒泡,选择,插入,快速)

    目录 1. 前言 2. 冒泡排序算法 2.1 摆擂台法 2.2 相邻两个数字相比较 3. 选择排序算法 4. 插入排序 5. 快速排序 6. 总结 1. 前言 所谓排序,就是把一个数据群体按个体数据的特征按从大到小或从小到大的顺序存放. 排序在应用开发中很常见,如对商品按价格.人气.购买数量……显示. 初学编程者,刚开始接触的第一个稍微有点难理解的算法应该是排序算法中的冒泡算法. 我初学时,“脑思维”差点绕在 2 个循环结构的世界里出不来了.当时,老师要求我们死记冒泡的口诀,虽然有点搞笑,但是当

  • 关于Python排序问题(冒泡/选择/插入)

    前言: 学过C语言肯定接触过排序问题,我们最常用的也就是冒泡排序.选择排序.插入排序……等等,同样在Python中也有排序问题,这里我也会讲解Python中冒泡排序.选择排序和插入排序的写法和思维,上正文! (这里我是以列表作为一个排序对象) 1.冒泡排序 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.

  • Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)

    本文实例汇总了Java各种排序算法.分享给大家供大家参考,具体如下: 1. 冒泡排序: public class SortTest { public static void main(String[] args) { int[] a = {345,7,32,5,4,-1,3,12,23,110,45645,321,456,78,-1,78,78,32,444,345}; show(a); bubbleSort(a); show(a); } private static void bubbleSo

  • C语言排序方法(冒泡,选择,插入,归并,快速)

    目录 1.冒泡排序 2.选择排序 3.插入排序 4.归并排序 5.快速排序 总结 1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成. 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重

随机推荐