快排核心思想:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
Java篇
public static void quickSort(int[] arr,int left,int rigth){
if (left > rigth){
return;
}
int base = arr[left];
int i = left;
int j = rigth;
while (i != j){
while (base <= arr[j] && i < j){
j --;
}
while (base >= arr[i] && i < j){
i ++;
}
sort(arr,i,j);
}
arr[left] = arr[i];
arr[i] = base;
quickSort(arr,left,i - 1);
quickSort(arr,i + 1,rigth);
}
public static void sort(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
Python篇
def quickSort(arr,left,right):
# 判断是left <= right ,否则程序错误
if (left > right):
return
#给基准值赋值,一般情况下为该数组的第一位
base = arr[left]
#给左下标赋值
i = left
#给右下标赋值
j = right
#左右下标不相等的情况进行检索
while i != j:
#先使用右下标往左移动,依次与基准值进行判断,基准值小于等于右下标元素的且左下标小于右下标的则继续循环检索执行右下标递减,否则停止递减右下标
while base <= arr[j] and i < j:
j = j - 1
# 先使用左下标往右移动,依次与基准值进行判断,基准值大于等于左下标元素的且左下标小于右下标的则继续循环检索执行左下标递增,否则停止递增左下标
while base >= arr[i] and i < j:
i = i + 1
#此时左右下标已停止递增或递减,交换左右下标元素值
sowf(arr, i, j)
#判断左右下标相等情况,则将该值与基准值进行交换
arr[left] = arr[i]
arr[i] = base
#依次调用基准值左右两段的数组,递归调用
quickSort(arr,left,i-1)
quickSort(arr,i+1,right)
#数组根据下标替换元素
def sowf(arr,i,j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp