快速排序 实际 java_快速排序的Java和python实现,亲测实际可用

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值