算法——快速排序

package test;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/** 算法思想:從序列中選出一個基準,把比基準小的放到基準的前面,比基準大的放在基準後面,然後遞歸前後兩個分區。 **/
public class Algorithm {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<Integer> array = new ArrayList<Integer>();
		array = getRandomList(10, 100);
		quickSort(array, 0, array.size() - 1);
		System.out.println(array.toString());
	}

	/**
	 * 快速排序
	 * 
	 * @Title quickSort
	 * @param array需要排序的數據
	 * @param start數據的起始位置
	 * @param end數據的結束位置
	 * @Author: YHM
	 */
	static void quickSort(List<Integer> array, int start, int end) {
		if (start < end) {
			int i = start, j = end, base = array.get(i);// array.get(start),即array.get(i)就是第一個坑,因爲array.get(i)處的數放到了base中
			while (i < j) {
				// 從又向左找小於base的數來填array.get(i)
				while (i < j && array.get(j) > base) {
					j--;
				}
				if (i < j) {
					array.set(i++, array.get(j));// 將array.get(j)填到array.get(i)中,array.get(j)就形成了一個新坑
				}

				// 從左向右找大於base的數來填array.get(j)
				while (i < j && array.get(i) < base) {
					i++;
				}
				if (i < j) {
					array.set(j--, array.get(i));// 將array.get(i)填到array.get(j)中,array.get(i)就形成了一個新坑
				}

			}
			// 退出時,i等於j,將base填到這個坑中
			array.set(i, base);

			// 遞歸調用
			quickSort(array, start, i - 1);// 排序基準的前部分
			quickSort(array, i + 1, end);// 排序基準的後部分

		}

	}

	/**
	 * 不帶種子,每次的隨機數不同
	 * 
	 * @Title getRandomList
	 * @param count產生的隨機數的個數
	 * @param max產生的隨機數的範圍
	 * @return 隨機數列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomList(int count, int max) {
		ArrayList<Integer> list = new ArrayList<>();
		Random rand = new Random();
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

	/**
	 * 帶種子,每次的隨機數相同
	 * 
	 * @Title getRandomList
	 * @param count產生的隨機數的個數
	 * @param max產生的隨機數的範圍
	 * @return 隨機數列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomList(int count, int max, int seed) {
		ArrayList<Integer> list = new ArrayList<>();
		Random rand = new Random(seed);
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

	/**
	 * 生成完全不重複的隨機數
	 * 
	 * @Title getRandomList
	 * @param count產生的隨機數的個數
	 * @param max產生的隨機數的範圍
	 * @return 隨機數列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomListNoRepeat(int count, int max) {
		ArrayList<Integer> list = new ArrayList<>();
		SecureRandom rand = new SecureRandom();
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章