* 快速排序
*
* 1. 从数列中挑出一个元素,称为“基准key”;起始索引值为start, 结束索引值为end,
* 2. 重新排序数列,以基准key为切入点, 起始索引start右移, 结束索引end左移, 直到start大于等于end, 此时start或者end左边数列全部小于右边数列,
* 递归运算, 把小于基准值元素的子数列和大于基准值元素的子数列重复上述步骤排序(两个子数列的分割点为start或者end并非基准值)。
*
* @param numbers
* @param start
* @param end
*/
public static void quickSort(int[] numbers, int start, int end) {
if (start < end) {
int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)
int temp; // 记录临时中间值
int i = start, j = end;
do {
while ((numbers[i] < base) && (i < end))
i++;
while ((numbers[j] > base) && (j > start))
j--;
if (i <= j) {
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
i++;
j--;
}
} while (i <= j);
if (start < j)
quickSort(numbers, start, j);
if (end > i)
quickSort(numbers, i, end);
}
}
/**
* 冒泡排序
相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
* @param numbers
*/
public static void bubbleSort(int[] numbers) {
for (int i = 0; i < numbers.length - 1; i++) {
for (int j = 0; j < numbers.length - 1 - i; j++) {
if(numbers[j] > numbers[j+1]) {
int temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
}
/**
* 选择排序
从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
* @param numbers
*/
public static void selectSort(int[] numbers) {
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers.length - 1 - i; j++) {
if(numbers[i] > numbers[i+1+j]) {
int temp = numbers[i];
numbers[i] = numbers[i+1+j];
numbers[i+1+j] = temp;
}
}
}
}
/**
* 插入排序
* @param numbers
*/
public static void insertSort(int[] numbers) {
int size = numbers.length, temp, j;
for (int i = 1; i < size; i++) {
temp = numbers[i];
for (j = i; j > 0 && temp < numbers[j - 1]; j--)
numbers[j] = numbers[j - 1];
numbers[j] = temp;
}
}