C语言:快排详解


快排方式:对有序数据用明显
1、随机选取基准法
2、三分选取基准法
优化:
1、排序数据少于100个,直接插入法
2、聚集相同基准元素法
快排递归:
时间复杂度:好情况(无序数据):O(nlog2n);
坏情况(有序数据):O(n2)
空间复杂度:O(log2n)
稳定性:不稳定
算法思想:声明一个低指针L和一个高指针H
(一)、1次快速排序(基准par(下面用tmp))
1、首先L在首元素位置,H在末尾元素位置,将L的首元素放到tmp中
2、这时H往前走,找到比tmp小的数,将H处的元素给L
3、这时L往后走,找到比tmp大的数,将L处的元素给H
4、如此循环,当两者第一次相遇时(哪个指针最后走的),将tmp的值传给走的指针
(二)、多次找基准(分别在左右两边都排序)
1、首先保证要第一次排序完后的一边至少有两个元素,即par>(start+1)和par>(end+1)
2、然后调用递归本身
(三)、再写一个QuickSort函数
void QuickSort(int *arr,int len)
(四)、Show函数显示一下
//代码实现

#include
#include
//递归快排
int Partion(int *arr,int low,int high)//一次快排返回基准par
{
	int tmp = arr[low];
	while(low < high)
	{
		while(low < high && arr[high] > tmp)
		{
			high--;
		}
		if(low >= high)
		{
			break;
		}
		else
		{
			arr[low] = arr[high];
		}
		while(low < high && arr[low] < tmp)
		{
			low++;
		}
		if(low >= high)
		{
			break;
		}
		else
		{
			arr[high] = arr[low];
		}
	}
	arr[low] = tmp;
	return low;
}
void Quick(int *arr,int start,int end)
{
	int par = Partion(arr,start,end);
	if(par > start+1)//左边至少有两个数据
	{
		Quick(arr,start,par-1);
	}
	if(par < end-1)//右边至少有两个数据
	{
		Quick(arr,par+1,end);
	}
}
void QuickSort(int *arr,int len)
{
	Quick(arr,0,len-1);
}
void Show(int *arr,int len)
{
	for(int i=0;i

非递归版本:在栈上实现(栈是用来存放 数对下标)
算法思想:声明一个栈顶指针top,一个低指针L和一个高指针H
1、先开辟一块内存当做栈(对其进行断言),第一次排序完后的需排序的一边至少有两个元素
即par>(low+1)和par>(high-1)
2、入栈时,两边数据段先放低指针,再放高指针
3、当栈指针top>0 时,先取高指针,再取低指针,再进行一次找基准,再将数据段入栈
4、最后释放内存,将其置为空
//代码实现

void QuickSort(int *arr,int len)
{
	//1、申请一块内存当做栈
	//2、进行一趟快速排序 找到基准
	//3、把基准两边的数据段的首尾数对进行入栈
	//4、取出数据进行快速排序
	//5、如果top>0,循环
	int *stack = (int *)malloc(sizeof(int )*len);
	assert(stack != NULL);
	int top = 0;
	int low = 0;
	int high = len-1;
	int par = Partion(arr,low,high);
	if(par > low+1)//第一次找完基准之后左边有两个以上数据
	{
		stack[top++] = low;
		stack[top++] = par-1;
	}
	if(par < high-1)
	{
		stack[top++] = par+1;
		stack[top++] = high;
	}
	while(top > 0)
	{
		high = stack[--top];
		low = stack[--top];
		par = Partion(arr,low,high);
		if(par > low+1)
		{
			stack[top++] = low;
			stack[top++] = par-1;
		}
		if(par < high-1)
		{
			stack[top++] = par+1;
			stack[top++] = high;
		}
	}
	free(stack);
	stack = NULL;
}

你可能感兴趣的:(排序)