JAVA最常用的排序_冒泡排序、选择排序、快速排序

来源:互联网 发布:dpp软件 mac 编辑:程序博客网 时间:2024/05/21 05:07

排序算法是Java面试题中最常考的,笔试题、机试题都会有,所有掌握最常用的排序是必须。

在效率中快速排序是这几种效率最高的。

代码验证过,可以直接复制测试运行。

代码如下:

package com.lcx.interview;import java.util.Arrays;/** *  * @author qq1013985957 */public class Interview_9_Sort {public static void main(String[] args) {long begion;long end;int[] a = ArraySort.randomArray(5000, 4);int[] a2 = ArraySort.randomArray(5000, 4);int[] a3 = ArraySort.randomArray(5000, 4);begion = System.currentTimeMillis();ArraySort.bubbleUp(a);end = System.currentTimeMillis();System.out.println("冒泡排序时间(毫秒):"+(end-begion));System.out.println(Arrays.toString(a));begion = System.currentTimeMillis();ArraySort.chooseSort(a2);end = System.currentTimeMillis();System.out.println("选择排序时间(毫秒):"+(end-begion));System.out.println(Arrays.toString(a2));begion = System.currentTimeMillis();ArraySort.fastSort(a3, 0, a3.length-1);end = System.currentTimeMillis();System.out.println("快速排序时间(毫秒):"+(end-begion));System.out.println(Arrays.toString(a3));}}class ArraySort{/** * 冒泡排序算法: * 俩俩比较,如果a[x]>a[x+1] 就交换值,这是升序排序,将大值一直冒泡到最后面。 * 第一轮将最大值冒泡到最后一位,然后此数不在参与比较。 * 第二轮将剩余的最大值冒泡到倒数第二位,然后此数不在参与比较。 * 。。。 * 反之这是降序冒泡,把最小值的冒泡到最后。 * @param a */public static void bubbleUp(int[] a){for(int i=0;i<a.length-1;i++){//这里可以少循环一次,最后一轮剩1个数内循环不在循环了,外循环是控制循环次数的。for(int j=0;j<a.length-i-1;j++){//内循环,进行冒泡if(a[j]>a[j+1]){int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}}/** * 选择排序算法: * 第一个数和后面所有数进行比较,取最小值(升序)/取最大值(降序)。 * 同样,然后第二个数和后面所有数进行比较,取最值。 *  * @param a */public static void chooseSort(int[] a){for (int i = 0; i < a.length; i++) {for (int j = i+1; j < a.length; j++) {if(a[i]>a[j]){int temp = a[j];a[j] = a[i];a[i] = temp;}}}}/** * 快速排序算法: * 快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。 * 对这个数的两边再递归上述方法。 * 此处采用最简单的快速排序,选择数组最左边的数为基准数。 * @param a */public static void fastSort(int[] a,int left,int right){if(left>=right){//此时整理已经完成了return ;}int l = left;int r = right;int baseNum = a[left];/** * 将所有比基准大的数放在一边,比基准小的数放到另一边,<span style="color:#ff0000;">与基准数相等放在2边都可以,但是不能不放或者2边都放</span>。 * 当不满足条件时,该基准数已经找到自己的位置,也就是左边全是小于等于自己的数,右边全是大于自己的数。 * 此时是 按升序排序 */while(l<r){<span style="color:#ff0000;">//将小于基准数的放在左边</span>while(l<r&& a[r] >= baseNum){//从后往前找,直到找到小于基准数的下标。r--;}a[l] = a[r];<span style="color:#ff0000;">//将大于或等于基准的数字放到右边</span>while(l<r&&a[l] < baseNum ){//从前往后找,直到找到大于或等于基准数的下标。l++;}a[r] = a[l];}a[l] = baseNum;//一轮结束,将基准数放到正确的位置fastSort(a, left, l-1);//基准数左边继续fastSort(a, l+1, right);//基准数右边继续}/** *  * @param length 随机数组长度 * @param bits 数组中数字的位数 * @return */public static int[] randomArray(int length,int bits){int[] arr = new int[length];for(int i=0;i<length;i++){arr[i] = (int) (Math.random()*Math.pow(10, bits));}return arr;} }

快速排序中,红色字体要注意,一定要考虑和基准数相等情况,如果2边都不放和基准数相等的数或者2边都放,那么如果数组中有重复的数字将一直死循环。

结果截图:

0 0
原创粉丝点击