改进版快速排序(平均复杂度O(NlogN))

#include<iostream>
using namespace std;

#define MAXSIZE  21
typedef int SqList[MAXSIZE];
#define   ElementType int
void Swap(int &a, int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
} 

//*********************************************************
ElementType Median3( ElementType *A, int Left, int Right )
{
		int Center = ( Left + Right ) / 2;

		if ( A[ Left ] > A[ Center ] )
		Swap( A[ Left ], A[ Center ] );

		if ( A[ Left ] > A[ Right ] )
		Swap( A[ Left ], A[ Right ] );

		if ( A[ Center ] < A[ Right ] )
		Swap( A[ Center ], A[ Right ] );

		return A[ Right ]; /* 返回pivot */
}

void Quicksort( ElementType *A, int Left, int Right )
{
	if(Left>=Right){return ;}
	{
        int	Pivot = Median3( A, Left, Right );
	    int	i = Left;
	    int j = Right;

		  for( ;  ; )

		{
			  while ( i<j && A[i] < Pivot ) {  ++i;   }
			  // 注意这里是>=否则当Pivot和头尾数据相等时就会死循环
			  while ( i<j &&  A[j] >= Pivot ) { --j;   }  

			if ( i < j )
			Swap( A[i], A[j] );
			else break;
		}
			Swap( A[i], A[Right] );

		   Quicksort( A, Left, i-1 );
	       Quicksort( A, i+1, Right );

	}

}

void Quick_Sort(ElementType *A,int N)//接口
{
   Quicksort( A, 0, N-1 );
}
//////////////////////////////////////////////////////

void main()
{
	SqList sq = {49,38, 65, 97, 76, 13, 27, 49 };

	 Quick_Sort( sq,8);//
	 	 for (int i = 0; i < 8; i++)
    {
		 cout << sq[i] <<",";
    }
    cout << endl;

}

为了尽可能降低复杂度,出现了一些边界控制的问题,在老师的帮助下,完成了代码。

有不足之处,还望指出。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 22:15:54

改进版快速排序(平均复杂度O(NlogN))的相关文章

改进版高速排序(平均复杂度O(NlogN))

#include<iostream> using namespace std; #define MAXSIZE 21 typedef int SqList[MAXSIZE]; #define ElementType int void Swap(int &a, int &b) { a = a^b; b = a^b; a = a^b; } //********************************************************* ElementType

快速排序[平均时间复杂度O(NlogN)]

基本思想: 假设我们现在对"6 1 2 7 9 3 4 5 10 8"这10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数.分别从初始序列"6 1 2 7 9 3 4 5 10 8"两端开始"探测".先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换它们,用两个变量i和j分别指向最左边和最右边,直到i=j,将基准数与a[i]交换,再继续递归对两测进行一样的方式. 快速排序的每一轮处理其实就是

平均时间复杂度为O(nlogn)的排序算法

本文包括 1.快速排序 2.归并排序 3.堆排序 1.快速排序 快速排序的基本思想是:采取分而治之的思想,把大的拆分为小的,每一趟排序,把比选定值小的数字放在它的左边,比它大的值放在右边:重复以上步骤,直到每个区间只有一个数.此时数组已经排序完成. 快速排序最重要的是partition函数功能的实现,也就是将比选定基数小的值放在他的左边,比选定基数大的值放在它的右边的功能函数. 熟悉快速排序的人也许都会有自己的partition函数的写法.此处,提供两种不同的partition函数写法. 例1:

一文搞定十大经典排序算法(Java实现)

本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较

寻找最小的K个数

寻找最小的K个数 题目描述:查找最小的K个数 题目:输入n个整数,输出其中最小的K个数 例如,输入1.2.3.4.5.6.7.8这8个数字,则最小的4个数字为1.2.3.4. 第一节.各种思路,各种选择 要求一个序列中最小的K个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的K个数即可: 至于选取什么样的排序方法,第一时间应该想到的是快速排序,我们知道,快速排序平均时间复杂度为O(nlogn),然后再遍历序列中前K个元素输出,即可,总的时间复杂度为O(nlogn +

排序函数sort用法简介

排序算法有很多,冒泡排序,选择排序,堆排序,快速排序,归并排序,基数排序-- 其中平均复杂度O(nlogn)的排序算法或者在某方面有特殊优势的算法在ACM中才有实际使用价值,所以上述提到的前2种大家以后就不要用了.其他排序算法大家会慢慢接触,本文主要介绍使用最多的排序函数 sort.大家可能会遇到qsort,qsort比较复杂,逐渐淡出ACMer的视线,所以不用管它. sort函数是C++标准库函数,需要包含头文件 #include <algorithm> 并声明命名空间 using name

剑指Offer--030-最小的K个数

链接 牛客OJ:最小的K个数 九度OJ:http://ac.jobdu.com/problem.php?pid=1371 GitHub代码: 030-最小的K个数 CSDN题解:剑指Offer–030-最小的K个数 牛客OJ 九度OJ CSDN题解 GitHub代码 最小的K个数 1371-最小的K个数 剑指Offer–030-最小的K个数 030-最小的K个数 题意 题目描述 输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字, 则最小的4个数字是1,2,3

bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大概就是sort一下,记录每个点的rank.然后链表一下,很好理解,复杂度nlogn,瓶颈在于排序. #include<cstdio> #include<algorithm> #include<iostream> using namespace std; struct nod

复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

时间复杂度分析有哪些? 最好情况时间复杂度(best case time complexity) 最坏情况时间复杂度(worst case time complexity) 平均情况时间复杂度(average case time complexity) 均摊时间复杂度(amortized time complexity) 最好.最坏情况时间复杂度 最好情况时间复杂度就是在最理想的情况下,执行这段代码的时间复杂度. 最好情况时间复杂度就是在最糟糕的情况下,执行这段代码的时间复杂度. 来看看下面这段