处理海量数据的高级排序之——快速排序(C++)

 

代码实现                                                                                                                                                                                                       

#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;

int a[1000000];
int tempA[1000000];

#define BEGIN_RECORD \
{                                \
clock_t ____temp_begin_time___;    \
____temp_begin_time___=clock();

#define END_RECORD(dtime) \
dtime=float(clock()-____temp_begin_time___)/CLOCKS_PER_SEC;\
}
/*
 快速排序(挖坑填数)
 a - 待排序的数组
 l - 排序区域的左边界    
 r - 排序区域的右边界
*/
void quickSort(int a[], int l, int r)
{
    if(l < r)    //快排每次把一个数排到正确位置,便以此点把原排序区域细分为两个更小的排序区域。通过不断递归,当新的排序区域右边界不再大于左边界时,说明已不需要排序,则停止递归,排序完毕
    {
        int i,j,x;
        i = l;
        j = r;
        x = a[i];    //选取排序区域左边第一个数作为本次排序的数

        while(i < j)    //该循环可称之为换坑过程,i,j相当于左右两边坑的位置,当右边坑位置不再大于左边坑位置时(此时两坑位置必定相同),说明已比较到中点,结束换坑过程
        {
            
            while(i < j && x < a[j])    //从右向左找小于x的值
            {
                j--;
            }
            if(i < j)                    //找过后就将其换到左边第1个位置,下一次则填入左边第2个位置,以此类推
            {
                a[i++] = a[j];
            }
            while(i < j && x > a[i])    //从左向右找大于x的值
            {
                i++;
            }
            if(i < j)                    //找到后将其填入右边第1个位置,下一次则填入右边第2个位置,以此类推
            {
                a[j--] = a[i];
            }
        }
        a[i] = x;    //当换坑过程结束后,在i位置以左的值都小于x,i位置以右的值都大于x,说明x找到了正确的位置,将x值填入(填坑过程)

        //将x值位置以左,以右分为两个新的排序区域,重复换坑填坑的过程
        quickSort(a, l, i-1);
        quickSort(a, i+1, r);
    }
}


void printArray(int a[], int length)
{
    cout << "数组内容:";
    for(int i = 0; i < length; i++)
    {
        if(i == 0)
            cout << a[i];
        else
            cout << "," << a[i];

 }
    cout << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    float tim;

 for (int i = 0; i < 1000000; i++)
    {
        a[i] = int(rand() % 100000);
    }
    BEGIN_RECORD

 //printArray(a, sizeof(a)/sizeof(int));
    quickSort(a, 0, sizeof(a)/sizeof(int) - 1);
    //printArray(a, sizeof(a)/sizeof(int));
    END_RECORD(tim)
    
    cout << "运行时间:" << tim << "s" <<  endl;

 system("pause");
    return 0;
}

 

posted @ 2014-08-12 19:51  立航  阅读(786)  评论(0编辑  收藏  举报