快排简单实现

没事再写下经典的快排代码,感觉顺手多了……

还是比较懒,Wiki(http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F)介绍如下:

算法

快速排序是一种“分而治之、各个击破”的观念。

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

步骤为:

  1. 从数列中挑出一个元素,称为 "基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

最坏情况下,是倒序排好的情况。需要n^2,当时老师说过,加上一个random可以使评价情况变好。既是在partition的循环前,把区间中的随机一个值和data[end]交换。

代码如下:

#include <iostream>
#include <algorithm>

using namespace std;

#define ARRAY_SIZE 100
int data[ARRAY_SIZE];

int partition(int data[], int begin, int end)
{
	int mid = begin - 1;
	for (int i = begin; i < end; i++)
	{
		if (data[i] < data[end])
		{
			swap(data[++mid], data[i]);
		}
	}
	swap(data[++mid], data[end]);
	return mid;
}

void quickSort(int data[], int begin, int end)
{
	if (begin < end)
	{
		int mid = partition(data, begin, end);
		quickSort(data, begin, mid - 1);
		quickSort(data, mid + 1, end);
	}
}

void Printn(int data[], int size)  
{  
	for (int i = 0; i < size; i++)  
	{  
		cout << data[i] << " ";  
	}  
	cout << endl;  
}  

void Getn(int data[], int size)  
{  
	for (int i = 0; i < size; i++)  
	{  
		cout << i + 1 << ":\t";
		cin >> data[i];
	}  
}

int main()
{
	int size;  
	while (true)  
	{  
		cout << "Please input the data size(no more than " << ARRAY_SIZE << "):(0 to quit.)";  
		cin >> size;  

		if (0 == size)  
		{  
			break;  
		}  

		Getn(data, size);  
		quickSort(data, 0, size - 1);
		Printn(data, size);  
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值