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

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

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

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

代码如下:

package com.lcx.interview;

import java.util.Arrays;

/**
 * 
 * @author 
 */
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边都放,那么如果数组中有重复的数字将一直死循环。

结果截图:

发布了217 篇原创文章 · 获赞 466 · 访问量 69万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览