快速排序基本思想,递归写法,python和java编写快速排序

1、基本思想

快速排序有很多种编写方法,递归和分递归,分而治之法属于非递归,比递归简单多了。在这不使用代码演示。下面我们来探讨一下快速排序的递归写法思想吧。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

2、python实现

# coding:utf-8
import numpy
def quickSort(arr,start,end):

    if start>end:
        return arr
    left,right = start,end
    base = arr[left]
    while left<right:
        while arr[right]>=base and left<right:
            right -=1

        arr[left]=arr[right]

        while arr[left]<base and left<right:
            left+=1

        arr[right]=arr[left]
    arr[left] = base
    quickSort(arr,start,left-1)
    quickSort(arr,left+1,end)

if __name__=="__main__":

    arrs = numpy.random.randint(0,20,(10))
    print(arrs)
    quickSort(arrs,0,len(arrs)-1)
    print(arrs)

3、java实现

private static void quickSort(List<Double> array, int start, int end) {
        if (start>end){
            return;
        }
        int left = start,right = end;
        double base = array.get(left);

        while (left<right){
            while (array.get(right)>=base && left<right){
                right --;
            }
            array.set(left,array.get(right));
            while (array.get(left)<base && left<right){
                left ++;
            }
           array.set(right,array.get(left));
        }

        array.set(left,base);
        quickSort(array,start,left-1);
        quickSort(array,left+1,end);
    }

java使用ArrayList来计算快排,也可以使用数组。代码流程差不多。

原文地址:https://www.cnblogs.com/wuzaipei/p/10843635.html

时间: 2024-09-29 15:39:51

快速排序基本思想,递归写法,python和java编写快速排序的相关文章

各种排序算法python和java实现(二)

第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下. 1.快排 光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去.快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列B的值全部比该值小,这听起来像是二叉排序树.然后依次对子序列进行如上操作,很明显快排最简单的实现就是用递

java之快速排序

//基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. public static void main(String []args){      int arr[]={-1,-5,6,2,0,9,-3,-8,12,7};      QuickSort qs=new QuickSort();      qs.sort(0, arr.leng

快速排序的c++实现 和 python 实现

最近在学python,其中有个要求实现快速排序的练习,就顺便复习了c++的快速排序实现. 快速排序的基本思想是,通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小.继续对长度较短的序列进行同样的分割,最后到达整体有序.在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间. 详细描述:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部

Java算法快速排序

快速排序的原理:每次将序列以一个值为界限分成两组,在将两个序列分别以一个界限分成两组这样一直分下去. int[] a = {11,222,44,63,84,11,24,53,123,25,98,76,34}; 第一步:以34将数组a分成两组  11, 25, 24, 11              34,  63, 44, 53, 123, 222, 98, 76, 84 第二步:以11将11, 25, 24, 11分为两组  11, 11,     24, 25.以84将34,  63, 44

你需要知道的九大排序算法【Python实现】之快速排序

五.快速排序 基本思想:  通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: ? #coding: utf-8 #!/usr/bin/python import random #随机生成0~100之间的数值 def get_andomNumber(num): lists=[] i=0 while i<num: lists.append(random.randint(0,100)) i+=1 ret

java中快速排序的理解以及实例

所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值都会跑到这个key的后面,不是的话就可能你写错了,小于这个key的就会跑到这个值的前面:然后我们对这个分段的数组再时行递归调用就可以完成整个数组的排序. 用图形法表示由

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

Python简单的实现快速排序

常见的快排排序:快排实现原理,可以更好理解快排思想 def quick_sort(alist, start, end): if start >= end: return mid = alist[start] left = start right = end # left与right未重合,就向中间移动 while left < right: while left < right and alist[right] >= mid: right -= 1 alist[left] = al

计算斐波那契数列的性能对比:Python,Java,Go

??本文采用递归办法来计算斐波那契数列中的第38项,用于对于三种计算机语言的计算性能,这三种语言为:Python,Java,Go. ??我们采用递归法来求解斐波那契数列的第n项f(n),其算法描述如下: function fib(n) if n = 0 return 0 if n = 1 return 1 return fib(n ? 1) + fib(n ? 2) 对于公平起见,我们利用三种程序计算f(38),运行100遍,得到平均耗时,作为性能对比. ??Python程序如下: # -*-