排序--快速排序算法

 待排序无序数组 a[10]={34,2,77,23,1,5,7,9,11,44}

(第一轮) 

第一步:设左边第一个元素34为基准元素base,拿出来放在一边,这样34的位置就空了出来

第二步:从最右边开始向左一个个地和base比较,当找到比base小的元素11,就把它放到34空出来的位置上,这样11的位置空了出来

第三步:从最左边开始向右一个个地和base比较,当找到比base大的元素77,就把它放到11空出来的位置上,这样77的位置空了出来

第四步:又从最右边开始向左一个个地和base比较,当找到比base小的元素9,就把它放到77空出来的位置上,这样9的位置空了出来

第五步:又从最左边开始向左一个个地和base比较,当找到元素9的位置时还是找到不比base大的,就把base(34)放在元素9的位置上,现在base(34)的左边都是比它小的元素,右边都是比它大的元素,这样base(34)的位置就可以确定了,位置下标为7

(第二轮)

 把上一轮找出的位置下标7左边的所有元素分为一新的数组,右边的也分为新的一组,分别重复第一轮的步骤

(......)

 每重复一轮可以确定一个元素的具体位置,直到所有元素都确定好位置

 

平均时间复杂度为:O(N*LogN)

最差时间复杂度为:O(N^2)

是否稳定:不稳定

 

C++代码如下:

#include "stdafx.h"

using namespace System;

int Division(int a[],int left,int right)
{
    int base=a[left];
    while(left<right)
    {
        while(left < right && a[right]>base)
        {
            right--;
        }
        a[left]=a[right];

        while(left < right && a[left]<base)
        {
        left++;
        }
        a[right]=a[left];
    }
    a[left]=base;
    return left;
}

//快速排序
void Quick(int a[],int left,int right)
{
    int i,j;
    if(left<right)
    {
        i = Division(a,left,right);
        Quick(a,left,i-1);
        Quick(a,i+1,right);
    }

}


int main(array<System::String ^> ^args)
{
    int i,a[10]={34,2,77,23,1,5,7,9,11,44};
    Console::WriteLine("sort before:");
    for(i=0;i<10;i++)
    {
    Console::Write(a[i]+ " | ");
    }

    Console::WriteLine("\n");

    Quick(a,0,9);

    Console::WriteLine("sort after:");
    for(i=0;i<10;i++)
    {
    Console::Write(a[i]+ " | ");
    }

    Console::ReadLine();
    return 0;
}

posted @ 2012-10-15 15:13  无主之城  阅读(204)  评论(0编辑  收藏  举报