码迷,mamicode.com
首页 > 编程语言 > 详细

初学算法-快速排序与线性时间选择(Deterministic Selection)的C++实现

时间:2015-09-01 01:54:12      阅读:641      评论:0      收藏:0      [点我收藏+]

标签:

    快速排序算法其实只做了两件事:寻找分割点(pivot)和交换数据。

    所谓寻找分割点,既找到一个预计会在中间位置附近的点,当然尽量越接近中点越好。

    所谓交换数据,就是把比这个分割点小的数据,最终都放在分割点左边,比它大的都放在右边。

    技术分享

    设要排序的数组是A[left]……A[right],首先任意选取一个数据(一般算法:使用随机数选取一个区间内的数。 文艺算法:取A[left]、A[right]和A[rand()]的中值。 二笔算法:选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

快速排序的具体算法是:

1)设置两个变量i、j,排序开始的时候:i=left,j=left+1;

2)取关键数据和A[left]交换,赋值给key,即key=A[left];

3)从j开始向后搜索,即由前开始向后搜索(j++),找到第一个小于key的A[j],将A[++i]和A[j]互换。

4)重复第3步,直到 j>right,此时循环结束

5)此时令 int q=i;在A[left]...A[q-1]和A[q+1]...A[right]上重复1-4过程直到递归结束。

    

    这样,我们就可以将它兑现为代码:

/**
 * The Quick Sort Algorithm by C++
 * Average Time Cost: nlogn
 * Author: Zheng Chen / Arc001
 * Copyright 2015 Xi‘an University of Posts & Telecommunications
 */
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;
long long ans = 0;

void swap(int &a, int &b)
{
    int c = a;
    a = b;
    b = c;
}

int partition(int A[],int l,int r)
{
    int t = rand()%(r-l);
	int x = A[l+t];
	int i = l;
	int j = l+1;

	swap(A[l+t],A[l]);

	for(;j<=r;j++){
		if(A[j]<=x){
			++i;
			swap(A[i],A[j]);
		}
	}

	swap(A[i],A[l]);
	return i;
}


void Quick_Sort(int A[],int l,int r)
{
    if(l<r){
        int q = partition(A,l,r);
        Quick_Sort(A,l,q-1);
        Quick_Sort(A,q+1,r);
    }
}

int main()
{
    /*int A[] = {7,6,5,4,3,2,1};
    Quick_Sort(A,0,6);
    for(int i=0;i<7;i++)
    	cout<<A[i]<<‘ ‘;
    */
    fstream in;
    in.open("QuickSort.txt");
    int *A = new int[10000];
    int i = 0;
    for(i=0;i<10000;i++)
        in>>A[i];
    Quick_Sort(A,0,9999);
    for(i=0;i<10;i++)
        cout<<A[i]<<‘ ‘;
    return 0;
}


    至于线性时间选择,今天有点晚了,待明天一定更新。如果您觉得这篇文章对您有些许帮助,欢迎转载和收藏!



初学算法-快速排序与线性时间选择(Deterministic Selection)的C++实现

标签:

原文地址:http://my.oschina.net/bgbfbsdchenzheng/blog/499857

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!