经典快速排序 与随机快排(应用荷兰国旗问题优化)

1.经典快速快速排序:

时间复杂度不稳定  时间复杂度:O(N*logN)~O(N2) 

 

 

1.经典快排的实现逻辑:

  • 先从数列中取出一个数作为基准数(通常取最后一个数)。
  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 再对左右区间重复第二步,直到各区间只有一个数。

代码实现:


/*
快速排序 ,借鉴03-荷兰国旗问题,提高效率
*/

#include<iostream>
using namespace std;

void swap2(int arr[], int L, int R)
{
	int temp=arr[L];
	arr[L] = arr[R];
	arr[R] = temp;
}

int* Partition(int arr[], int L, int R)
{
	int less = L - 1;
	int more = R;
	int *arr1=new int[2] ;
	while (L < more)
	{
		if (arr[L] < arr[R])
			swap2(arr, ++less, L++);
		else if (arr[L] > arr[R])
			swap2(arr, --more, L);
		else
			L++;

	}
	swap2(arr, more, R);
	arr1[0] = less + 1;
	arr1[1] = more;
	//cout << arr[0] << arr[1];
	return arr1;
	
}

void quickSort(int arr[], int L, int R)
{
	if (L < R)
	{
		int *arr1;
		arr1= Partition(arr, L, R);
		quickSort(arr, L, arr1[0] - 1);
		quickSort(arr, arr1[1] + 1,R );			
	}
}
void PrintArray(int arr[], int legth)
{
	for (int i = 0; i < legth; i++)
	{
		cout << arr[i] << ' ';
	}
	cout << endl;
}


int main()
{
	int arr[10] = { 1,3,2,4,6,5,9,8,7,6 };
	quickSort(arr, 0, 9);
	PrintArray(arr, 10);

	system("pause");
	return 0;

}


2.随机快排

随机快排的时间复杂度:O(N*logN)

就是改在Partition函数中加入:

int i = rand() % (R - L + 1) + L;//随机一个数组的下标
    swap2(arr, i, R);//交换i位置和最右边数组的元素

这就是随机快排和经典快排在code上的差别。


/*
快速排序 ,借鉴03-荷兰国旗问题,提高效率
*/

#include<iostream>
using namespace std;

void swap2(int arr[], int L, int R)
{
	int temp = arr[L];
	arr[L] = arr[R];
	arr[R] = temp;
}

int* Partition(int arr[], int L, int R)
{
	int less = L - 1;
	int more = R;
	int *arr1 = new int[2];
	int i = rand() % (R - L + 1) + L;//随机一个数组的下标
	swap2(arr, i, R);//交换i位置和最右边数组的元素

	while (L < more)
	{
		if (arr[L] < arr[R])
			swap2(arr, ++less, L++);
		else if (arr[L] > arr[R])
			swap2(arr, --more, L);
		else
			L++;

	}
	swap2(arr, more, R);
	arr1[0] = less + 1;
	arr1[1] = more;
	//cout << arr[0] << arr[1];
	return arr1;

}

void quickSort(int arr[], int L, int R)
{
	if (L < R)
	{
		int *arr1;
		arr1 = Partition(arr, L, R);
		quickSort(arr, L, arr1[0] - 1);
		quickSort(arr, arr1[1] + 1, R);
	}
}
void PrintArray(int arr[], int legth)
{
	for (int i = 0; i < legth; i++)
	{
		cout << arr[i] << ' ';
	}
	cout << endl;
}


int main()
{
	int arr[10] = { 1,3,2,4,6,5,9,8,7,6 };
	quickSort(arr, 0, 9);
	PrintArray(arr, 10);

	system("pause");
	return 0;

}


 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值