码迷,mamicode.com
首页 > 其他好文 > 详细

算法导论 第7章 快速排序

时间:2014-08-10 15:49:50      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:算法导论   快速排序   数据结构   合并排序   c++   

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小。


快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要;相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的。


/*
 *	算法导论 第七章 快速排序
 *	最坏情况下时间复杂度为O(n^2),这种情况出现在每次选择pivot的时候
 *	都选到了最大或者最小的元素,即每次划分都有一边为空。
 *	其平均时间复杂度为O(nlgn),只要每次划分,每一边的元素都至少有一个就行
 */

#include <iostream>
using namespace std;

void printArray(int arr[], int len)
{
	for (int i=0; i<len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

void quickSort(int arr[], int p, int r);
int partition(int arr[], int p, int r);
void exchange(int arr[], int i, int j);

int main()
{
	int arr[] = {12, 21, 9, 80, 3, 11, 90, 4, 67};
	int len = sizeof(arr) / sizeof(arr[0]);

	cout << "原数组:" << endl;
	printArray(arr, len);

	quickSort(arr, 0, len-1);

	cout << "快速排序后的数组:" << endl;
	printArray(arr, len);
}

void quickSort(int arr[], int p, int r)
{
	if (p < r)
	{
		int q = partition(arr, p, r);
		quickSort(arr, p, q-1);
		quickSort(arr, q+1, r);
	}
}

int partition(int arr[], int p, int r)
{
	int pivot = arr[r];
	int i = p - 1;//i前面的(包括i)的元素都是不大于pivot的,i后面的都是大于pivot的元素
	int j;//j后面的(包括j)都是还没有划分的
	for (j=p; j<=r-1; j++)
	{
		if (arr[j] <= pivot)
		{
			i++;
			exchange(arr, i, j);
		}
	}
	i++;
	exchange(arr, i, r);
	return i;
}

void exchange(int arr[], int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}


算法导论 第7章 快速排序,布布扣,bubuko.com

算法导论 第7章 快速排序

标签:算法导论   快速排序   数据结构   合并排序   c++   

原文地址:http://blog.csdn.net/lucienduan/article/details/38469569

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