Java基础 浅谈冒泡选择 排序

2017-02-28  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读