Java冒泡排序、快速排序详解与代码解释

一、冒泡排序

       先看下这几幅图的规律,有助于你理解其中的思想。

第一幅:
这里写图片描述
第二幅:
这里写图片描述
第三幅:
这里写图片描述
冒泡排序思想
       如原数组{4,3,2,1},我们要将它从小到大排序,则要将大的数字依次往上浮(就好像冒泡现象一样),第一趟为{3,2,1,4},第二趟变为{2,1,3,4},第三趟为{1,2,3,4}。

       可见,数组长度为4,只需要4趟就可以将数组排序好,下面粘贴我的代码,如下:

public class MaoPaoPaiXu {

    public static void maoPao1(int[] a) {
        int tmp = 0; 
        for(int i = 0; i < a.length - 1; i++) { //排序趟数为a.length-1
            for(int j = 0; j < a.length - 1 - i ; j++) { //每趟中的内部排序循环次数为a.length - 1 - i
                                                         //注意减i是因为后面的已经排序好了,只需要排序前面的数
                if(a[j] > a[j+1]) {
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                }
            }
        }
        System.out.println("");
        for(int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

    public static void main(String[] args) {

        int[] a = {4,3,2,1};  
        maoPao1(a);

    }
}

二、快速排序

快速排序思路:
       给定一个数组,首先将第一个数(或最后一个)作为基准值(key),然后从后往前比较,把第一个比key值小的数与key所在位置调换;紧接着,从前往后比较,把第一个比key值大的数与key所在位置调换。以此类推,排序完后,此时在key值左边是比key小的数了,在其右边是比key大的数了。然后采用递归的方法,将key左边与右边的数进行排序即可。

咋们看图说话

       假设有个这样的数组{14,25,3,12,16,1},将其进行快速排序。
这里写图片描述

这里写图片描述
这里写图片描述

       可见,在基准值14左边是比14小的数,在其右边是比它大的数了,当然左右两边区间的数也可能是无序的,所以需要对其进行排序,这里使用递归就可以了。

代码解释:

public class Quick {
      public static void main(String []args){

            int[] a = {14,25,3,12,16,1};
            int start = 0; //开始的索引为0
            int end = a.length - 1; //结束的索引为a.length - 1

            sort(a, start, end); //调用sort函数

            for(int i = 0; i < a.length; i++) { //输出快速排序好的数组
                System.out.print(a[i] + " ");
            }
         }

      public static void sort(int[] a, int low, int hight) {
          int start = low; //将开始的索引赋值给start
          int end = hight; //将结束的索引赋值给end
          int key = a[low];//选第一个值作为基准值

          while(start < end) { //当start小于end的时候进行循环

              while(start < end && a[end] >= a[start]) //从后往前与基准值比较,把大于或等于基准值的数排除
                  end--; //结束的索引自减

              if(a[end] < key) { //判断是否比基准值key小,是则替换
                  int temp = a[end];
                  a[end] = key;
                  a[start] = temp;
              }

              while(start < end && a[start] <= a[end]) //从前往后与基准值比较,把小于或等于基准值的数排除
                  start++; //开始的索引自增

              if(a[start] > key) { //判断是否比基准值key大,是则替换
                  int temp = a[start];
                  a[start] = key;
                  a[end] = temp;
              }

          }

          //递归环节(包括递归出口)
          if(start > low) sort(a, low, start - 1); //将key左边的数进行排序,结束的索引变为start - 1
          if(end < hight) sort(a, end+1, hight);   //将key右边的数进行排序, 开始的索引变为end + 1
      }

}

猜你喜欢

转载自blog.csdn.net/qq_39039017/article/details/80910956
今日推荐