常见的几种排序——快速排序

快速排序

思想:

以low指向的数据为基准,把high位置所指向的数据与基准进行比较,如果比基准大,high继续向前移动,如果比基准小,就把high指向的数据挪动到low位置,再从low位置开始移动,如果比基准小,low继续向后移动,当low指向的数据比基准大于基准,就把low指向的数据挪动到high的位置,又重新从high位置开始进行比较,high和low进行交替比较,直到low=high则结束

实现代码:

快排的递归实现

int Partition(int * arr,int low,int high)   //一次划分
{
	int tmp = arr[low];
	while(low < high)
	{
		while(low < high && arr[high] >= tmp)
		{
			high --;             //移动high
		}
		if(low == high)
		{
			break;
		}
		else
		{
			arr[low] = arr[high];
		}
		while(low < high && arr[low] <= tmp)
		{
			low ++;              //移动low
		}
		if(low == high)
		{
			break;
		}
		else
		{
			arr[high] = arr[low];
		}
	}
	arr[low] = tmp;
	return low;

}
void Quick(int * arr,int low,int high)  //通过递归方式多次划分使数组有序
{
	int par = Partition(arr,low,high);
	if(low + 1 < par)
	{
		Quick(arr,low,par-1);  //low+1<par,说明了在划分位置的左边至少还有两个数据需要排序
	}

	if(high - 1 > par)
	{
		Quick(arr,par+1,high);
	}
}
void Quick_sort(int * arr,int len)
{
	Quick(arr,0,len-1);
}

快排的非递归

//快排的非递归使用栈进行排序
void Quick_sort(int *arr,int len)
{
    int size = (int)(log10((double)len))/(log10((double)2));
    int *stack = (int *)malloc(size*sizeof(int)*2);
    int top = 0;
    int low = 0;
    int high = len - 1;
    int par = patition(arr,low,high);
    if(low + 1 < par)
    {                                      //把low、high的数据压入栈
        stack[top++] = low;
        stack[top++] = par - 1;
    } 
    if(high - 1 > par)
    {
        stack[top++] = par + 1;
        stack[top++] = high;
    }
    while(top > 0)
    {
        high = stack[top--];                 //出栈
        low = stack[top--];
        par = patition(arr,low,high);
        if(low + 1 < par)
        {
            stack[top++] = low;
            stack[top++] = par - 1;
        } 
        if(high - 1 > par)
        {
            stack[top++] = par + 1;
            stack[top++] = high;
        }

    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值