1.基本思想
快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边。当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可。
2.算法实现
这里我使用的是递归的方法。
假设先取数组第一个元素为x,同时设i,j分别指向数组头部和数组尾部,即i=0,j=length(arr)-1;因为x取得第一个元素,所以最开始i所指向的位置即x的位置。
先从尾部j指向的元素开始比较,只要j指向的元素大于x,j便向前移一位;一旦j指向的元素小于x,就将j指向的元素放在当前x所在的位置(即当前i指向的位置),此时可以当做x目前处于j所指向的位置。然后将x与i所指向的元素进行比较,只要i指向的元素小于x,i便向后移动一位;一旦i指向的元素大于x,就将i指向的元素放在当前x所在的位置(即当前j所指向的位置),此时可以将x的位置认为是i指向的位置。不断循环,直到 i>=j。此时便找到了x最终的位置,即此时i,j所共同指向的位置。再将x的值填到这个位置当中,便完成了一趟快速排序。
java的代码实现如下:因为初学java,这里使用方法的时候踩了几个坑,发现静态方法中不能调用非静态成员,后来把sort改为非静态方法
1 public classQuickSort {2 public static voidmain(String args[]) {3 int arr[] = {6,2,10,3,8,9};4 QuickSort sorter = newQuickSort();5 int m = 0, n = arr.length - 1;6 sorter.sort(arr, m, n);7 }8
9
10 public void sort(int arr[], int m, intn) {11 if(m
13 int i = m, j =n;14 while(i < j) {//快速排序的核心,将大于x的值全放大x的右边,小于的全放在左边
15 while(i < j && x arr[j]) {//如果j指向的数小于x,则放到x左边;if条件以防止循环因i>=j终止
19 arr[i] =arr[j];20 }21 while(i < j && x >arr[i]) {22 i++;23 }24 if(x < arr[i]) {//如果i指向的数大于x,则放大x右边
25 arr[j] =arr[i];26 }27 }28 arr[i] =x;29 showArray(arr);30 sort(arr, m, i-1);//对左边的部分进行快速排序
31 sort(arr, i+1, n);//对右边的部分进行快速排序
32 }33 }34
35 public void showArray(intarr[]) {36 for(intx:arr){37 System.out.print(x+"、");38 }39 System.out.println("");40 }41 }
python 的代码实现如下
1 #-*- coding: utf-8 -*-
2
3 defQuickSort(lista, m, n):4 if m <5 i="m6" j="n7" x="lista[i]8" while j:>
9 while i < j and x
11 if x >lista[j]:12 lista[i] =lista[j]13 while i < j and x >lista[i]:14 i = i + 1
15 if x
18 print(lista)19 QuickSort(lista, m, i - 1)#递归处理左边部分
20 QuickSort(lista, i + 1, n)#递归处理右边部分
21 returnlista22
23
24 if __name__ == '__main__':25 listx = [6,2,10,3,8,9]26 a =027 b = len(listx) - 1
28 listb =QuickSort(listx, a, b)29 print(listb)
最后其实发现,每趟排序中的j--,i++部分的循环体均可以使用if语句来达到目的,但是在网上看到的博客大家都是使用循环,如果有知道的朋友欢迎给我解答
5>