数据结构——排序——快速排序

快速排序的基本思想是通过一轮排序将待排数据分为独立的两部分,其中一部分数据的关键字均比另一部分的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的 。就像切苹果一样,先将苹果分为两瓣,然后再分别对两瓣苹果继续进行切分,其中用到的就是递归的思想,话不多少,直接上代码:

#include"stdafx.h"
#include"stdlib.h"
#include"math.h"
using namespace std;

void swap(int k[], int low, int high)  //交换函数
{
	int temp;
	temp = k[high];
	k[high] = k[low];
	k[low] = temp;
}

int Partition(int k[], int low, int high)    //进行数据的排序
{
	int point;
	point = k[low];
	while (low < high)
	{
		while (low < high&&k[high] >= point)
		{
			high--;
		}
		swap(k, low, high);
		while (low < high&&k[low] <= point)
		{
			low++;
		}
		swap(k, low, high);
	}
	return high;

}

void Qsort(int k[], int low, int high)  //进行递归
{
	int point;
	if (low < high)
	{
		point = Partition(k,low,high);
		Qsort(k, low, point - 1);
		Qsort(k, point + 1, high);
	}
}

void quicksort(int k[], int n)
{
	Qsort(k, 0, n-1);
}
int main()
{
	int a[] = { 1,5,3,7,9,6,4 };
	quicksort(a,7);
	for (int i = 0; i < 7; ++i)
	{
		printf("%d", a[i]);
	}
}

 以上就是快排的实现代码,对上述代码进行优化的方法主要包括以下四种:1、优化选取枢轴 2、优化不必要的交换 3、使用尾递归优化递归操作 4、优化数组较小时的排序方案 下文展示了采用四种方法进行优化后的快排代码:

#include"stdafx.h"
#include"stdlib.h"
#include"math.h"
using namespace std;
#define MAX_LENGTH_INSERT_SORT 7

void swap(int k[], int low, int high)
{
	int temp;
	temp = k[high];
	k[high] = k[low];
	k[low] = temp;
}

void Isort(int k[], int n)  //小数组用直接插入排序
{
	int i, j, temp;
	for(i=1;i<n;i++)
	{
		if (k[i] < k[i - 1])
		{
			temp = k[i];
			for (j = i - 1; k[j] > temp; j--)
			{
				k[j + 1] = k[j];
			}
			k[j + 1] = temp;
		}
	}
}
void insertsort(int k[], int low,int high)
{
	Isort(k + low, high - low + 1);
}

int Partition(int k[], int low, int high)
{
	int m = low + (high - low) / 2;    //三数取中法
	if (k[high] > k[low])
		swap(k, low, high);
	if (k[high] < k[m])
		swap(k, m, high);
	if (k[m] > k[low])
		swap(k, m, low);
	int point;
	point = k[low];
	while (low < high)
	{
		while (low < high&&k[high] >= point)
		{
			high--;
		}
		k[low] = k[high];
		while (low < high&&k[low] <= point)
		{
			low++;
		}
		k[high] = k[low];
		k[low] = point;
	}
	return high;

}

void Qsort(int k[], int low, int high)
{
	int point;
	if ((high - low) > MAX_LENGTH_INSERT_SORT)
	{
		point = Partition(k, low, high);
		Qsort(k, low, point - 1);
		low = point + 1;               //尾递归
	}
	else
		insertsort(k,low,high);
}

void quicksort(int k[], int n)
{
	Qsort(k, 0, n-1);
}
int main()
{
	int a[] = { 1,5,3,7,9,6,4 };
	quicksort(a,7);
	for (int i = 0; i < 7; ++i)
	{
		printf("%d", a[i]);
	}
}

至今快排算法在优化后,依然是排序算法里的王者,里面优化算法的思想需要学以致用,尾递归,三数取中法都是需要认真掌握的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值