快速排序

来源:互联网 发布:java搭建socket服务器 编辑:程序博客网 时间:2024/05/16 13:54

快速排序代码如下:

快速排序也是一种原地排序的算法,时间复杂度平均情况下为O(nlgn),在最坏的情况下为O(n*n)。虽然这个最坏运行时间比较差,但是快速排序的通常是最实用的排序方法,因为快速排序的平均性能很好,O(nlgn)中的常数因子很小。另外它还是一种原地排序的算法。

快速排序也是一种分治排序的算法。快速排序分为两个部分:

1、partion:这部分是快速排序的关键部分,用来将一个数组进行初步的划分。划分结果为,小于等于数组中最后一个数的数都放在数组的前半部分呢,而大于数组中最后一个数的数都被放在数组的后半部分。并返回一个q值来代表这时候数组划分的位置。

2、quicksort:quick是一个递归的过程,用来对partion区分开的两部分再进行一样的划分,直到整个排序过程的完成。



这两部分的算法如下:

1、partion(A, r, p):

 i = r-1,j = r;//用两个光标分别指示位置,r不断循环,并将小于A[p]的值换到前面,并使i加一

for j = r to p

if( A[r] < A[p])

exchange A[i+1] and A[r]

i = i+1

exchange A[i+1] and A[p]

return i+1


2、quicksort(A,r,p)

if( r < p)

q = partion( A,r,p)

quicksort( A,r,q-1)

quciksort(A,q+!,p)

通过这一个过程我们就完成快速排序。



// 快速排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int partion( int* A,int r,int p){int i(r-1);int j(0);int temp(0);for(j = r;j != p; ++j){if( A[j] <= A[p]){temp = A[i+1];A[i+1] = A[j];A[j] = temp;++i;}}temp = A[i+1];A[i+1] = A[p];A[p] = temp;//for(int l = r; l!= p+1 ;++l)//{//cout<<A[l]<<" ";//}//cout<<endl;return i+1;}void quicksort(int* A,int r,int p){//int q = partion(A,r,p);注意1/***********************************************************************************************************************在此处犯过一个很难发现的错误。一开始的程序没有 注意2 的这句,有 注意1 的这句,程序发生段错误。首先我们要明确一点,那就是当r = 0 p = 1时算出的q可能为1。那么当出现前一句说的一种情况时,quicksort(A,q+1,p)运行时,我们实际的参数为quicksort(A,2,1),在这里我们就能发现将 q = partion(A,r,p)放在if里面和外面的区别了,如果放在if里面的话,由于r<p不成立,会直接return,而放在外面的话,要先计算一次partion(A,2,1)后才会return,因此就会发生段错误。**********************************************************************************************************************/if( r < p){int q = partion(A,r,p);//注意2quicksort(A,r,q-1);quicksort(A,q+1,p);}}int _tmain(int argc, _TCHAR* argv[]){int A[18] = {3,43,45,57,4,65,50,4,6456,49,4132,4,324,32,4321,4,132,41};//partion(A,0,9);quicksort(A,0,17);for(int i = 0; i != 18;++i)cout<<A[i]<<" ";return 0;}


0 0