1.介绍:快速排序在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
2.思想及步骤:快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)
Step1:在一个数列中找出一个数,作为基数(pivot),在Partition函数中实现。
Step2:已此基数为准,重新排列,把较大的数放在它的右边,较小的数在左边。最终此基数就会排到最终的位置上,它的左右两边为一次分治后的啦两个分区(Partition)。
Step3:递归下去直至数列已排序。
3.代码段:
(1)C++实现
#include<iostream>
using namespace std;
int partition(int *list,int low,int high)
{
int temp=list[low];
while(low<high)
{
while(low<high && list[high]>=temp) high--;
list[low]=list[high];
while(low<high && list[low]<=temp) low++;
list[high]=list[low];
}
list[low]=temp;
return low;
}
void quick_sort(int *list,int low,int high)
{
if(low<high)
{
//找到基数
int pivot=partition(list,low,high);
//递归第一个分区
quick_sort(list,low,pivot-1);
//递归第二个分区
quick_sort(list,pivot+1,high);
}
}
//test
int main()
{
int list[9]={1,23,12,45,98,56,34,6,64};
quick_sort(list,0,8);
for(int i=0;i<10;++i) cout<<list[i]<<" ";
return 0;
}
>>>1 6 12 23 34 45 56 64 98 //输出结果
(2)Python实现
#!/bin/python
#coding=utf-8
'''
先通过partition函数找到基数:参数为arr为一个整形数组,low为数组第一个数下标,high为数组最后一个数下标
'''
def partition(arr,low,high):
temp=arr[low]
while low < high:
while low < high and arr[high] >= temp:
high-=1
arr[low]=arr[high]
while low < high and arr[low] <= temp:
low+=1
arr[high]=arr[low]
arr[low]=temp
return low
'''
快排主函数
'''
def quick_sort(arr,low,high):
#判断一个入参是否有效
if arr==[]:
return -1
#执行
if low < high:
pivot=partition(arr,low,high)
quick_sort(arr,low,pivot-1)
quick_sort(arr,pivot+1,high)
#test
arr=[1,23,12,45,98,56,34,6,64]
quick_sort(arr,0,8)
print arr
>>>1, 6, 12, 23, 34, 45, 56, 64, 98 #输出结果
(3)java实现
//定义快排接口
interface QuickSort
{
public int partition(int arr[],int low,int high);
public void quick_sort(int arr[],int low,int high);
}
//test
public class Test implements QuickSort
{
//实现partition
public int partition(int[] arr,int low,int high)
{
int temp=arr[low];
while(low<high)
{
while(low<high && arr[high]>=temp) high--;
arr[low]=arr[high];
while(low<high && arr[low]<=temp) low++;
arr[high]=arr[low];
}
arr[low]=temp;
return low;
}
//快排主体
public void quick_sort(int[] arr,int low,int high)
{
if(low<high)
{
//找到基数
int pivot=partition(arr,low,high);
//递归第一个分区
quick_sort(arr,low,pivot-1);
//递归第二个分区
quick_sort(arr,pivot+1,high);
}
}
public static void main(String args[])
{
int[] arr={1,23,12,45,98,56,34,6,64};
Test quick=new Test();
quick.quick_sort(arr,0,8);
for(int i=0;i<9;++i)
{
System.out.println(arr[i]);
}
}
}
>>>1,6,12,23,34,45,56,64,98//输出结果