2.快速排序

快速排序思想:每次找到一个标杆,在序列中的前面部分放置比标杆小的元素,在序列后面部分放置比标杆大的元素,那么标杆放置的位置则可以确认。待主循环结束,则是排序好的序列。

确认标杆位置:

在排序过程中,需要两个前后索引index[left],index[right]。index[left]向后前进,而index[right]往前回退。这两个索引需要找到不符合要求的元素(前面的元素比标杆大,后面的元素比标杆小),将两者交换,待循环结束后,则可以放置标杆位置。

找到新的标杆:

选取index[left]和index[right]需要注意,index[left]>index[标杆] , index[right]>index[标杆]。所以index[right]的位置则是当前标杆的位置,swap(index[right],index[标杆])。

当循环结束后,则是排序好的序列。

例如: 5   4    6   3    1(设p1为index[left],p2为index[right])

5为标杆:

p1>index[5],p2>index[5]

  

出现了不符合要求的,则swap()。

因为p2<p1则不需要swap(),那么p2则是标杆的位置,所以:swap(5,p2)

当前序列为:

3     4     1     5      6

3为新的标杆:

p2>p1,则swap(p1,p2),然后继续循环

p2<p1,不用swap(),p2的位置是标杆位置,则swap(3,p2)

至此序列为:

1      3      4      5      6

参考代码:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int c_n=10;  
//取一个标杆,序列前放比标杆小的,后面放比标杆大的
//遍历序列,找到不符合要求的数据,并交换
//遍历结束,则可以放置标杆,继续寻找新的标杆
//时间复杂度log(n)
void swap(int *a, int *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
void quicksort(int *a,int left,int right)
{
	int i = left+1;
	int j = right-1;
	if (i <= j)
	{
		while (i < j)
		{
			while (a[left]>a[i] && i < right) //找到左边比left大的数
				i++;
			while (a[left] <= a[j] && j > left)  //找到右边比left小的数
				j--;
			if ( i < j)  //交换
			{
				swap(&a[i], &a[j]);
			}
		}
		if (a[left]>a[j])  //需要判断当前位置是否是基准值应该放的位置
			swap(&a[j], &a[left]);	//交换,新的基准值
		quicksort(a, left, j);
		quicksort(a, j + 1, right);
	}
	return;
}
void main()
{
	int a[c_n] = { 0 };
	srand(time(NULL));
	for (int i = 0; i < c_n; i++)
	{
		a[i] = rand() % 200;
	}
	quicksort(a, 0, c_n);
	for (int i = 0; i < c_n; i++)
		cout << " " << a[i];
	system("pause");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值