处理海量数据的三大排序之——快速排序(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;
}

处理海量数据的三大排序之——快速排序(C++),布布扣,bubuko.com

时间: 2024-10-13 07:57:06

处理海量数据的三大排序之——快速排序(C++)的相关文章

处理海量数据的三大排序之——归并排序(C++)

代码实现                                                                                                                                                                                   #include "stdafx.h" #include <iostream> #include <cti

处理海量数据的三大排序之——堆排序(C++)

在面对大数据量的排序时(100W以上量级数据),通常用以下三种的排序方法:快速排序.归并排序,堆排序.在这个量级上,其他冒泡,选择,插入排序等已经根本没法看了,效率极低,跟前面三种排序差了千百倍,因此不作比较. 这三种排序的平均时间复杂度均为O(nlogn),快速排序,归并排序在面对基本有序序列排序时,效率反会降低.且归并排序需要用到O(n)的临时存储空间.而堆排序没有明显缺点,特别在面对经常会插入新元素的排序需求,堆排序效果最好. 下面是三种排序对100W个无序数组进行排序的时间对比,可以看出

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

希尔算法简介                                                                                                                                        常见排序算法一般按平均时间复杂度分为两类:O(n^2):冒泡排序.选择排序.插入排序O(nlogn):归并排序.快速排序.堆排序 简单排序时间复杂度一般为O(n^2),如冒泡排序.选择排序.插入排序等高级排序时间复杂

排序之快速排序

package com.xsz.demo; /**     * @author cwqi    * @date 2015-1-6    */ //排序之快速排序,基本思路為分治+挖坑,方法有兩種:一是雙邊掃面:二是單邊掃描. public class QuickSort { public static void main (String[] args){ int a[] ={2,3,30,1,4,56,2,7,3,8}; //int a[] ={4,5,6,2,7,3,8}; //int a[]

8. 冒泡法排序和快速排序(基于openCV)

一.前言 主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用. 二.冒泡法排序 冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2).主要思想如下: 分为内外循环,每次外循环确定一个大的数据的具体位置,如下实例: 从图中可以看出,进过两次外循环就可以得到排序结果,随后的8次循环都浪费了,为了避免这种情况,我们可以设置一个状态参数,用来表示内循环是否发生数据的交换,从而作为外循环是否退出的信号. 三.快速排序 快速排序是最有效的排序方法之一,其主要思

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

希尔排序和快速排序

//希尔排序 在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助. 如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换. D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想.算法先将要排序的一组数按某个增量d分成若干组, 每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序. 当增量减到1时,整个要排序的数被分成一组,排序完成 p

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

冒泡排序: int[] hehe={4,7,2,5,6,9,0}; for(int i=0;i<hehe.length;i++){ for(int j=i+1;j<hehe.length;j++){ if(hehe[i]>hehe[j]){ int temp=hehe[i]; hehe[i]=hehe[j]; hehe[j]=temp; } } } 插入排序 int[] a={13,7,8,9,10,1,2,32}; int i,j,t,h; for (i=1;i<a.length