快速排序
快速排序是对冒泡排序的一种改进,实现的途径为在数组中取一个数为基数。基数的左边为比基数小的值,基数的右边是比基数大的值
左边的值又可以取基数继续排序 一直到被分成只有一个值的时候 这时已经为有序排序
按下面的例子来说 有一个数组{1,5,2,6,7,3,4,8,9}
会随机选择一个数字作为基数 标准为需要排序的起始索引和结束索引之间的整数随机值 比如上面的例子 随机一个数字为3
将索引为3的值作为基数,也就是数字6为基数。 建立两个索引i 和j i从左开始扫描 j从右开始扫描
基数左边的数字(i<=基数)必须比索引代表的数字大才交换(if(arr[i]>arr[arr]))才交换数字 这时候i肯定是5
遍历结束后所有比5小的数字都在5的左边 所有比5大的数字都在5的右边
将左边的数组继续按照当前方法选随机基数排序 一直到数组只有一个数字的时候排序完成
代码:
public static int[] quickSort(int[] array, int startIndex, int endIndex) {
if (array.length < 1 || startIndex < 0 || endIndex >= array.length || startIndex > endIndex) {
return null;
}
int pivotIndex = partition(array, startIndex, endIndex);
//将小于基数索引的数组继续排序 范围为开始索引到 基数索引-1
if (startIndex < pivotIndex) {
quickSort(array, startIndex, pivotIndex - 1);
}
//将大于基数索引的数组继续排序 范围为基数索引+1 到 结束索引
if (endIndex > pivotIndex) {
quickSort(array, pivotIndex + 1, endIndex);
}
return array;
}
private static int partition(int[] array, int startIndex, int endIndex) {
//随机获取一个基准(需要保证在数组内)
int pivotIndex = (int) (startIndex + Math.random() * (endIndex - startIndex + 1));
//取出开始索引
int i = startIndex;
//遍历开始索引到结束索引的元素
while (i <= endIndex) {
//如果在基数左边
if (i <= pivotIndex) {
//在基数左边只要值比基数大才交换
if (array[i] > array[pivotIndex]) {
//交换
swap(array, i, pivotIndex);
//元素值已经变换 记得要更改基数的索引
pivotIndex = i;
}
//不在基数左边
} else {
//只要值比基数小才交换
if (array[i] < array[pivotIndex]) {
//交换
swap(array, i, pivotIndex);
//将两个值的索引也交换
//为什么上面不用交换索引? 因为前面是基数在索引右边 交换索引之后遍历索引会跳过n个元素
//如果索引在基数右边 交换索引也就是重新遍历
int tmp = pivotIndex;
pivotIndex = i;
i = tmp;
}
}
i++;
}
//返回基数值,只有返回的基数到了最边缘 这部分才算交换结束
//假设一个数组分成两份 左边3个元素 右边4个元素
//只有左边基数元素索引到0 右边基数元素到6才能保证数据的准确性
return pivotIndex;
}
//交换位置
private static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}