快速排序
最近闲来无事,研究了几种排序算法:
一、直接插入排序
基本思想:假设前面的n-1个数已经有序,将第n个数插入到前面的n-1个数中,使之依然有序。
编码过程:依次将数组后面的数取出和前面的元素做比较,如果小于,则将其插入到目标元素的前面,然后依次将目标元素后面的元素后移。
缺点:这种排序算法在移动数据的时候会耗费很大的计算量
二、简单选择排序
基本思想:从数组中选择最小的一个与第一个数交换位置,然后第二,第三,知道最后两个相比较。
编程过程:循环遍历数组,直接交换数据位置。
缺点:需要往复循环的遍历整个数组,在数组较大的时候效率低下
三、快速排序
基本思想:取一个基准数据,然后将数组划分为两个部分,递归
编程过程:取第一个数作为基准,遍历整个数组,将数组分为两个部分,再分别对两个部分做同样的操作,直到有序。
该方法采用分而治之的办法,将数组依次拆分,效率较高,一百万的随机数采用快速排序耗时128毫秒
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);
}
}