• 处理海量数据的高级排序之——快速排序(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;
    }
  • 相关阅读:
    JavaScript如何获取一个元素的样式信息
    Linux服务器命令行操作(小白专用)
    Linux云服务器搭建node环境
    C++ new和delete运算符简介
    C++中free()与delete的区别
    VS2017+Qt开发时打开命令调试窗口
    opencv4.2版本遇到CV_MINMAX未声明标识符
    CUDA 数据传输
    uchar 存为8位/16位图像(QImage)
    Qt Creator删除toolbar中多余的“分隔符”
  • 原文地址:https://www.cnblogs.com/leoin2012/p/3908332.html
Copyright © 2020-2023  润新知