MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法三)

本算法核心代码翻译自《算法导论》(第三版)第7章:快速排序。这段代码也要求所排序列是“左闭右闭”区间,跟清华大学邓俊辉老师在《数据结构》MOOC课程中所讲的业界一般默认的“左闭右开”区间的序列不一样。“左闭右开”区间的快速排序在算法一和算法二中有,但是算法一和算法二我不开源哦!需要的可以联系我的QQ购买:3121432464,备注要说明原因。算法一和算法二的参考价格:1000元/个,先付款、后给代码,非诚勿扰。

#include <iostream>
using namespace std;

#define N 20

int recursion_time = 0;
//定义显示递归次数的全局变量 

int main()
{
	int a[N] = {30,38,3,32,15,  1,41,47,59,80,  6,93,78,18,65,  60,51,22,31,17};
	//测试数据前18个元素都不变,最后的元素分为四种情况测试:
	//整体个数为奇数个(19)且最末元素比最首元素大(31)
	//整体个数为奇数个(19)且最末元素比最首元素小(17)
	//整体个数为偶数个(20)且最末元素比最首元素大(17,31)
	//整体个数为偶数个(20)且最末元素比最首元素小(31,17) 
	
	void QuickSort(int *array, int start, int end);
	void OutputOfArray(int *array, int n);
	cout << "原数组为:" << endl;
	OutputOfArray(a, N);
	QuickSort(a, 0, N - 1);
	cout << "排序后的数组为:" << endl;
	OutputOfArray(a, N);
	return 0;
}

//以下两个函数的代码翻译自《算法导论》第三版中的快速排序算法 
void QuickSort(int *A, int p, int r)
{
	int Partition(int *A, int p, int r);
	int q = 0;
	
	if(p < r) 
	{
		q = Partition(A, p, r);
		
		//以下12行是测试代码 
		recursion_time++;
		cout << "第" << recursion_time <<"轮递归的结果为:" << endl;
		for(int i = p; i <= q - 1; i++)
		{
			cout << "a[" << i << "]=" << A[i] << "; ";
		}
		cout << "pivot=" << "a[" << q << "]=" << A[q] << "; ";
		for(int i = q + 1; i <= r; i++)
		{
			cout << "a[" << i << "]=" << A[i] << "; ";
		}
		cout << endl << endl;
		//输出本轮递归的结果,注意排版格式 
		
		QuickSort(A, p, q - 1);
		QuickSort(A, q + 1, r);
	}    
}

int Partition(int *A, int p, int r)
{
	int x = A[r];
	int i = p - 1;
	int temp = 0;
	
	for(int j = p; j <= r - 1; j++) 
	{
		if(A[j] <= x)
		{
			i = i + 1;
			
			temp = A[i];
			A[i] = A[j];
			A[j] = temp;
		}
	}
	temp = A[i + 1];
	A[i + 1] = A[r];
	A[r] = temp;
	
	return i + 1;
}

void OutputOfArray(int *array, int n)  
{  
    for(int i = 0; i < n; i++)  
        cout << array[i] << '\t';  
    cout << endl;  
} 

注意第22行最后一个参数要在宏N的基础上减1,否则会发生数组下标越界的错误。

测试结果:




posted on 2017-10-05 18:17  sunshineman1986  阅读(127)  评论(0)    收藏  举报

导航