/**
* 插入排序、冒泡排序、选择排序、快速排序
* @author ZHANGHAOHAO
* @date 2017/5/10
*/
public class Algorithm {
/**
* 插入排序:把未排序的插入到有序的序列里面
*
* @param array
* @return
*/
public static void insertSort(int[] array) {
if (array == null || array.length == 0)
throw new NullPointerException("no sort");
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < i; j++) {
if (array[i] < array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
/**
* 冒泡排序:把最大的数冒泡到最后面
*
* @param array
* @return
*/
public static int[] bubbleSort(int[] array) {
if (array == null || array.length == 0)
throw new NullPointerException("no sort");
for (int j = 0; j < array.length - 1; j++) {
for (int i = 0; i < array.length - j - 1; i++) {
if (array[i] > array[i+1]) {
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
}
return array;
}
/**
* 选择排序: 选出最小的和第一位数交换,选出第二小的和第二位数交换
*
* @param array
* @return
*/
public static int[] selectSort(int[] array) {
if (array == null || array.length == 0)
throw new NullPointerException("no sort");
for (int j = 0; j < array.length - 1; j++) {
int min = array[j];
int n = j;
for (int i = j + 1; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
n = i;
}
}
if (n != j) {
int temp = array[j];
array[j] = array[n];
array[n] = temp;
}
}
return array;
}
/**
* 快速排序,先找到中间值,然后在分块排序
*
* @param array
* @return
*/
public static int[] fastSort(int[] array, int start, int end) {
if (array == null || array.length == 0 || end >= array.length)
throw new NullPointerException("no sort");
if (end > start) {
int middle = getMiddle(array, start, end);
getMiddle(array, start, middle - 1);
getMiddle(array, middle + 1, end);
}
return array;
}
public static int getMiddle(int[] array, int start, int end) {
int middle = array[start];
while (end > start) {
while (end > start && array[end] >= middle)
end--;
array[start] = array[end];
while (end > start && array[start] <= middle)
start++;
array[end] = array[start];
}
array[start] = middle;
return start;
}
}