快速排序

Python

# -*- coding:utf-8 -*-

def quickSort1(arr):
  if len(arr)<2:
    return arr
  
  pivot = arr[0]
  left,right = [],[]
  arr.remove(pivot)
  
  for i in arr:
    if i>pivot:
      right.append(i)
    else:
      left.append(i)
      
  return quickSort1(left) + [pivot] + quickSort1(right)


def quickSort2(arr,left,right):
  if(left>=right):
    return
  
  pivot = arr[left]
  i = left
  j = right
  
  while(i<j):
    while(i<j and arr[j] >= pivot):
      j-=1
    arr[i]=arr[j]

    while(i<j and arr[i] <= pivot):
      i+=1
    arr[j]=arr[i]
    
  arr[i]=pivot
  quickSort2(arr,left,i-1)
  quickSort2(arr,i+1,right)
  
if __name__ == "__main__":
  arr = [1,2,4,6,43,2,3,7,8,5,2]
  print "1 排序前:",arr
  print "1 排序后:",quickSort1(arr)
  
  arr2 = [6,43,2,3,7,8,5,9]
  print "2 排序前:",arr2
  quickSort2(arr2,0,10)
  print "2 排序后:",arr2

Java

static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int index = getIndex(arr, left, right);
        quickSort(arr, left, index - 1);
        quickSort(arr, index + 1, right);
    }
}

static int getIndex(int[] arr, int left, int right) {

    int pivot = arr[left]; // 选取第一个值为pivot,不是left[0]
    int i = left;  // 初始化指针为范围边界
    int j = right;

    while (i < j) {
        // 右边开始找
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    // while 的退出条件为 i==j,所以pivot给arr[i]或者arr[j]都可以
    // pivot 归位
    arr[i] = pivot;
    return i;
}

public static void main(String[] args) {
    int[] arr = {3, 5, 12, 56, 2, 3, 4, 9, 10};
    System.out.println(Arrays.toString(arr));
    quickSort(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));
}
posted @ 2020-10-09 12:50  onehut  阅读(59)  评论(0)    收藏  举报