快速排序 与 随机快速排序 算法分析

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序的优点:

(1)原址排序,空间复杂度较小。

(2)虽然最坏情况下(有序数组)时间复杂度为 (n*n),但是平均性能很好,期望复杂度为( nlg(n) )。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)

步骤为:

(1)从数列中挑出一个元素,称为 "基准"(pivot),

(2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的
  中间位置。这个称为分区(partition)操作。

(3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

快速排序 与 随机快速排序的唯一区别就是:快速排序始终将数组最后一个元素作为基准,而随机快速排序是从数组中随机挑选一个元素和最后一个元素交换位置后,作为基准。随机快速排序基准的选择更能适应大规模随机数据的快速排序。

(随机快速排序算法)

快速排序源码:

#include <iostream>
#include <algorithm>
#include <cstdlib>

using namespace std;

class quick_sort_class
{
  public:
	quick_sort_class(int *a, int n):p_array(a), n_array(n){};
	~quick_sort_class();
	void quick_sort(int i, int j);
	void print();
  protected:
	int partition(int *a, int p, int r);
  private:
 	int *p_array;
	int n_array;

};

quick_sort_class::~quick_sort_class()
{
}

int quick_sort_class::partition(int *a, int p, int r)
{
	int x = a[r];
	int i = p-1;
	for(int j=p;j<r;++j)
	{
		if(a[j]<=x)
		{
			++i;
			swap(a[i], a[j]);
		}
	}
	swap(a[i+1], a[r]);
	return i+1;
}

void quick_sort_class::quick_sort(int i, int j)
{
	if(i<j)
	{
		int q = partition(p_array, i, j);
		quick_sort(i, q-1);
		quick_sort(q+1, j);
	}
}

void quick_sort_class::print()
{
	for(int i=0;i<n_array;++i)
		cout<<p_array[i]<<" ";
	cout<<endl;
}

int main()
{
	int array[10] = {8, 4, 7, 15, 10, 84, 23, 19, 3, 11};
	quick_sort_class myQuickSort(array, 10);
	myQuickSort.print();
	myQuickSort.quick_sort(0, 9);
	myQuickSort.print();
}

测试结果:

快速排序 与 随机快速排序 算法分析

时间: 2024-10-11 00:41:27

快速排序 与 随机快速排序 算法分析的相关文章

《github一天一道算法题》:快速排序和随机快速排序

看书.思考.写代码!!! /********************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:快速排序和随机快速排序 * 思路:采用分治+原址排序,分裂函数将区间分为三个子区间:<=主元.主元和>主元区间,再在主元旁边的两个子区间递归调用排序 * 分裂函数一般将区间最后一个元素作为比较的主元,随机快排则随机选取区间内的一个元素交换到末尾作为主元 * 空间复杂度:原

Python 实现快速排序和随机快速排序

直接上代码: #快速排序 #coding: utf-8 def quicksort(a,left,right): if(left<right): mid = partition(a,left,right) quicksort(a,left,mid-1) quicksort(a,mid+1,right) def partition(a,left,right): x = a[right] i = left-1 #初始i指向一个空,保证0到i都小于等于 x for j in range(left,ri

【算法设计-快速排序】随机快速排序算法

1.算法流程: 但是为了减少算法因为初始数据可能已经部分按大小排序,导致算法复杂性会变成o(n2)进行了随机选择方法 在random_partition中随机产生(p,r)之间的一个数字,然后交换A[i]与A[r]这样会使得快速排序算法的复杂性得到降低. 代码实现: #include<stdio.h> #include<stdlib.h> #define DataType int void FastSort(DataType A[], int left, int right);//

快速排序/随机快速排序

快速排序是一个递归算法,重点是Partition()函数的实现过程.随机快速排序中调用Randomized_Partition(),此函数的实现只需要在Partition()的基础上前面多一个随机化和交换的过程. int Partition(int*A,int p,int r); int Randomized_Partition(int*A,int p,int r); void Quicksort(int *A,int p,int r); void Randomized_Quicksort(in

算法导论-排序(二)快速排序、随机化快速排序

目录 1.本文介绍 2.快速排序 3.随机化快速排序 4.完整源码 5.参考资料 内容 1.本文介绍 主要内容分为两部分,一部分是介绍快速排序算法,分析其在最好.最坏以及最好最差交替出现情况下的算法效率:另一部分则是介绍随机化快排算法,以及分析其算法复杂度.最后给出c++实现代码. 2.快速排序 快速排序也是基于分治思想,首先把要排序的数组分为两份,然后再分别对分好的子数组进行快速排序.当子数组为1个元素时递归介绍,排序完成.快速排序属于“原地排序”,就是说在原有的数组内存上排序.不占用其他内存

随机快速排序

#include<iostream>#include <vector>#include <cstdlib>#include<ctime>using namespace std;/* 作用:返回一个在(min,max)之间的一个随机整数 参数:min--返回值的最小限制 max--返回值的最大限制*/int random(int min,int max){ srand((unsigned)time(NULL));//设置随机数的来源 return rand()

随机快速排序的细节和复杂度分析

0.经典快排:将数组最后位置的数值x作为划分值,将小于等于x的放在左边,大于x的放在右边, 让小于等于x区域的最后一个位置上放x值,如果有多个值等于x,中间区域放的什么值无所谓,左边区域最后一个数放x就可以,左边区域放小于等于x的值,右边放大于x的值,经典快排的时间复杂度和数据状况是有关系的.最好的时间复杂度是O(NlogN),最差情况的时间复杂度是O(N^2) 1.可以用荷兰国旗问题来改进快速排序 (1)将小于x的放在左边,等于x的放中间,大于x的放在右边,这样的话等于x的区域就不用动了,将小

随机快速排序学习记录

Randomized Quicksort·running time is independent of input ordering·no assumptions about the input distribution·np specific input elict the worst-case behavior·the worst-case is determined only by a random-number generator pivot on random element Anal

【转】三种快速排序算法以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到序列为空或