快速排序和冒泡排序都属于交换排序,算法描述:在数据序列中找一个参照物,从数据序列两端开始搜索,比参照物小的,放在参照物前边,比参照物小的放在参照物后边。
代码:
package per.data.paixu;
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] keys = new int[]{ 58, 68, 21, 22, 10};
quickSort(keys,0,keys.length-1);
System.out.println("\n\n"+"排序之后:");
for (int i = 0; i < keys.length; i++) {
System.out.print(keys[i] + "\t");
}
}
//快速排序
public static void quickSort(int[] keys, int begin, int end) {
//判断begin和end都没有越界
//判断begin < end
if (begin >= 0 && end >= 0 && begin < keys.length && end < keys.length && begin < end) {
//读取begin和end
int i = begin;
int j = end;
//将i取出,当作参照物,相当于挖好了一个坑,所以需要先从后往前扫描
int vot = keys[i];
//当i=j的时候,表示扫描完成
while (i != j) {
//从后往前,扫描比参照物小的值的下标
while (i < j && keys[j] >= vot) {
j--;
}
//将比参照物小的值,放入一开始挖好的坑里边,同时又挖了一个坑
if (i < j) {
keys[i++] = keys[j];
}
//从前往后,扫描比参照物大的值的下标
while (i < j && keys[i] <= vot) {
i++;
}
//将比参照物大的值,放入前边挖好的坑中
if (i < j) {
keys[j--] = keys[i];
}
}
//当i=j的时候表示一次扫描完成,此时会有一个多余的坑,把参照物放进去
keys[i] = vot;
//输出每一次的结果
System.out.println(begin + ".." + end + ", vot=" + vot + " ");
for(int iii = 0 ; iii < keys.length ; iii++){
System.out.print(keys[iii]+"\t");
}
System.out.println();
//递归参照物的后边
quickSort(keys, begin, j - 1);
//递归参照物的前边
quickSort(keys, i + 1, end);
}
}
}
算法分析:
最坏情况:o(n^2)
最好情况:o(n * log2 n)
总之,当n比较大时且数据数列随机排列时,快速排序是“快速”的;当n较小,或者参照物选取不合适的时候,是比较慢的。
快速排序是不稳定的