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;
}
}