Quicksort in Python

 1 #quick sort
 2 def quicksort(low, high, array):    limit = 10
 3     if low < 0 or high >= len(array):
 4         return
 5
 6     if (high-low)<limit:
 7         insertsort(low,high,array)
 8         return
 9
10     middle = (low+high)/2
11
12     if array[low] > array[middle]:
13         exchange(low,middle,array)
14
15     if array[middle]>array[high]:
16         exchange(middle,high,array)
17
18     if array[low]>array[high]:
19         exchange(low,high,array)
20
21     pivot = array[middle]
22
23     exchange(middle,high-1,array)
24
25     low_ind = low + 1
26
27     high_ind = high - 2
28
29     while low_ind <= high_ind:
30         while array[low_ind] < pivot:
31             low_ind+=1
32
33         while array[high_ind] > pivot:
34             high_ind-=1
35
36         if low_ind < high_ind:
37             exchange(low_ind,high_ind,array)
38
39             low_ind+=1
40             high_ind-=1
41         else:
42             break
43
44     exchange(low_ind,high-1,array)
45
46     quicksort(low,low_ind-1,array)
47     quicksort(low_ind+1,high,array)
48
49 #exchange two element
50 def exchange(index1, index2, array):
51     temp = array[index1]
52     array[index1] = array[index2]
53     array[index2] = temp
54
55 #insertion sort
56 def insertsort(low,high,array):
57     if low < 0 or high >= len(array):
58         return
59
60     outer = low + 1
61
62     while (outer<=high):
63         inner = low
64         while (inner<outer):
65             if array[outer]<array[inner]:
66                 array.insert(inner,array[outer])
67                 del array[outer+1]
68                 break
69             inner+=1
70         outer+=1
71
72 #test
73 array=[]
74
75 quicksort(0,len(array)-1,array)
76
77 print array

第一篇随笔, 就用来写一下快排吧,毕竟各种面试都会问到的。

我这边采用了三数中值法 来取pivot, 然后在待排序元素小于limit(这里设为10)的时候, 换用插入排序。

第一次发博文,自勉之

后记:

发完不就 就看到一篇博文http://www.cnblogs.com/figure9/archive/2010/12/10/1902711.html 研究最短用几行代码可以写完快排.

转载部分代码如下:

1 def q_sort(l):
2     return l if len(l)<=1 else q_sort([x for x in l[1:] if x<l[0]])+[l[0]]+q_sort([x for x in l[1:] if x>=l[0]])

这边没有考虑pivot的选取,永远选第一个作为pivot,因此有可能退化为最差情形.不过这么少的代码就写完了 还是很强大,初学python不久,两行代码都研究了好久。

时间: 2024-08-25 12:55:29

Quicksort in Python的相关文章

[算法导论]quicksort algorithm @ Python

算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if array[j] <= array[right]: i += 1 array[j], array[i] = array[i], array[j] array[i+1], array[right] = array[right], array[i+1] return i+1 def quicksort(arr

python 版 quicksort 快排

今天看了下苹果xml 解析,写了个小demo 心想还是 在博客上写点东西吧,毕竟很久很久都没有上来了 先上个效果图把 接下来 看下 工程目录图吧 本demo 分两种解析模式,一是苹果自带的, 首先先看下苹果自带的吧,工程文件为 NoteXMLParser 文件 ,另一种解析模式 是 NotesTBXMLParser文件 NoteXMLParser.h 文件代码如下 : // // NoteXMLParser.h // TestXML // // Created by choni on 14-5-

[硕.Love Python] QuickSort(快速排序)

def partition(a, i, j):     k = -1     while True:         while k * (a[i] - a[j]) >= 0:             if i == j:                  return i             j += k         a[i], a[j] = a[j], a[i]         i, j, k = j, i - k, -k def qsort(a, i, j):     if i <

quicksort(python)

quicksort(python) by 伍雪颖 def quicksort(array): less = [];greater = [] if len(array) <= 1: return array pivot = array.pop() for x in array: if x <= pivot: less.append(x) else: greater.append(x) return quicksort(less) + [pivot] + quicksort(greater) ar

python Quicksort demo

__author__ = 'student' ''' quicksort step 1, choose one pivot, such as pivot=la[0] step 2, scan the data from right side, find data less than pivot, then swap this with pivot pivot=1 [4] 5 7 3 20 9 [j] then scan from left side, find data greater than

LeetCode 16 3Sum Closest(C,C++,Java,Python)

Problem: Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S

快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止.上述过程称为第一趟冒泡排序,接着第二趟对前面n-1个关键字进行同样操作,…… 快速排序是对冒泡排序的一种改进,通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,可分别对这两部分记录以递归的方法继续进行排序,以达到整个序列有序. 单趟Partition()函数过程请看

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[

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

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