快速排序
2017-04-13 10:53
169 查看
/** * 快速排序 * @author TMACJ * 思路:一般选取第一个数作为基数,然后从后往前比较,如果比基数小,就和基数交换,在从左往右比较,如果比基数大,就交换,直到i=j为止,此时,把这个数组按基数为分界,分成两组,在进行上述计算 * 空间复杂度 O(1) * 时间复杂度O(n^2) * Q:快排为什么这么快? * A:因为你通过观察就可以知道,当一轮排序过后,比K值大的数和比K值小的数永远无法再比较,这就减少了比较的次数,所以快 * Q:什么时候用快排? * A:在相对无序的情况下,快排的效率高,而有序的情况下,基本会退化为冒泡排序,所以效率低,有序用插入排序的效率是最高的 */ public class QuickSort { /** * * @param a 传入的数组 * @param low0 原低位指针 * @param high0 原高位指针 */ public static void sort(int[] a,int low0,int high0){ int low = low0;//不破坏原始指针 int high = high0; if(low>=high){ return; } boolean direction = false;//控制方向的boolean变量,flase向前,true向后 while(low!=high){ if(a[low]>a[high]){ int temp = a[low]; a[low] = a[high]; a[high] = temp; direction = (direction == true)?false:true; } if(direction == false){ high--; } else{ low++; } } //分割成两个数组 low--; high++; sort(a, low0, low); sort(a, high, high0); } }