美文网首页
Java基础 浅谈冒泡选择 排序

Java基础 浅谈冒泡选择 排序

作者: 白衬衫少年 | 来源:发表于2017-02-28 20:56 被阅读0次

    “简单不先于复杂,而是在复杂之后.” —— Alan Perlis

    x.jpg

    序言

    冒泡排序

    冒泡排序是七大排序算法中较为简单的一个,它的时间复杂度为O(n^2),相较于快速排序,它的耗时较长,但是不会带来额外的空间开销(快速排序对栈的需求),因此它适用于数据量较小且对时间要求不高的业务,然而在实际使用过程中,几乎遇不到这种情况,所以冒泡排序极少被使用,但是作为一个基础的入门排序算法,他的算法思想还是十分值得我们去学习的.


    这是分割线.jpg

    冒泡排序核心思想

    冒泡排序的思想十分简单,它是依据气泡在水中不断上浮的灵感设计出来的:每次冒泡排序都是从头到尾,依次将紧挨着的两个数进行比较,如果前者比后者大,就交换两者的位置,否则不操作,直至末尾,比如先判断第一个和第二个的数,如果第一个比第二个大,就将两者交换,再接着判断第二个和第三个,以此类推,这样就达到了将最大的数放在最后面的效果,也就是将最大的数成功放在了它正确的位置上,之后再对前面的序列重复本操作,直到所有数都找到了自己正确的位置为止(正确的位置指的是排序之后它在序列中的位置)。

    这是分割线.jpg

    简单的例子

    例子.png

    动画演示

    冒泡排序.gif 这是分割线.jpg

    代码

    
            // 冒泡排序
            //定义一个数组 包含n个元素
            int[] arr2 = {5,8,4,2,7};
           
            //定义i用于 外循环的变量
            //外层循环控制值冒泡排序比较的趟数,一共比较 数组长度(arr2.length) - 1 趟
            for (int i = 0; i < arr2.length - 1; i++) {
    
                //定义j用于内层循环的变量
                //内层循环控制一趟比较的次数,每比较一趟要比上一次比较的次数少1次,因为上一趟比较已经目标元素排在数组的最后一个
                for (int j = 0; j < arr2.length - i - 1; j++) {
    
                    if (arr2[j] > arr2[j + 1]) {
    
                        int temp = arr2[j];
                        arr2[j] = arr2[j+1];
                        arr2[j+1] = temp;
                        //  每当 当前数组值arr2[j] 大于后面a[j+1]元素的值, 对两个值进行交换,引用间变量temp来实现两个数组值的互换
                    }
                }
            }
            for (int i:arr2) {
                System.out.println(i);
            }
    
    
    这是分割线.jpg

    选择排序

    选择排序核心思想

    首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。

    这是分割线.jpg

    动画演示

    选择排序动画演示.gif 这是分割线.jpg

    代码

        int[] arr1 = {5,2,3,6,1};
    
           // 选择排序
           for (int i = 0; i < arr1.length - 1; i++) {
    
           //  第i趟 -- a[i]后所有的数据和a[i]比较
               for (int j = i + 1; j < arr1.length; j++)
               {
                   //找到a[i] ~ a[length - 1中最小的数与a[i]进行交换
                   if (arr1[i] > arr1[j])
                   {
                       int temp = arr1[i];
                       arr1[i] = arr1[j];
                       arr1[j] = temp;
                   }
               }
           }
            
         // 增强循环 类似于 iOS的 for in遍历
           for (int i:arr1)  {
               System.out.println(i);
    
           }
    
    
    
    这是分割线.jpg

    相关文章

      网友评论

          本文标题:Java基础 浅谈冒泡选择 排序

          本文链接:https://www.haomeiwen.com/subject/xggxgttx.html