快速排序的两种思路

选取最左端(low)为基准值,以升序为例:

  1. 从右向左(high-low)查找到一个小于基准值的元素,再从左向右查找一个大于基准值的元素,再将两者相交换。

    while(arr[j]>=temp&&low<high) high–;
    while(arr[i]<=temp&&low<high) low++;
    swap(arr , low , high);

  2. 从右向左(high-low)查找到一个小于基准值的元素,将两者相交换,再从左向右查找一个大于基准值的元素,再将两者相交换。

    while(arr[j]>=temp&&low<high) high–;
    swap(arr , low , high);
    while(arr[i]<=temp&&low<high) low++;
    swap(arr , low , high);

注意: 选取不同的思路相应的函数结构以及返回值等细节代码会有细微的差异,且大部分情况下第二种思路的交换次数要比第一种多。

下面给出二者的完整代码:

#include<stdio.h>

void quickSort(int arr[],int low,int high)
{
	if(low > high) return;
	
	int left ,  right , base , temp;
	
	base = arr[low];
	left = low;
	right=high;
	
	while(left != right)
	{
	
		/*添加适当打印代码以观察和理解排序详细过程*/
		/*for(int i=0 ; i<6 ;i++)
		{
			printf("%d ",arr[i]);
			
		}
		printf("\n");
		*/
		
		while(arr[right]>=base && left<right) right--;
		while(arr[left]<=base && left<right)   left++;
		
		/*printf("%d,%d\n",left,right);*/
		
		
		if(left<right)
		{
			temp=arr[left];
			arr[left]=arr[right];
			arr[right]=temp;
		} 
	}


	arr[low]=arr[left];
	arr[left]=base;

	
	quickSort(arr,low,left-1);
	quickSort(arr,left+1,high);
	return;
	
}

int main()
{
	int n;
	scanf("%d ",&n);
	int arr[n];
	for(int i=0 ; i<n ;i++)
	{
		scanf("%d",&arr[i]);
	}
	
	quickSort(arr,0,n-1);
	
	for(int i=0 ; i<n ;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	
	
	return 0;
} 
#include<stdio.h>

    void Swap(int arr[], int low, int high)
    {
        int temp;
        temp = arr[low];
        arr[low] = arr[high];
        arr[high] = temp;
    }
     
     /*定位交换元素位置,并返回下一趟排序的最左端元素位置(即基准元素位置)*/
    int Location(int arr[], int low, int high)
    {
    
        int base = arr[low];
        
        while(low < high)
        {
            while(low < high && arr[high] >= base)
            {
                high --;
            }
            Swap(arr, low, high);
            
            /*printf("%d,%d\n",low,high);*/
            
            /*for(int i=0 ; i<6 ;i++)
    		{
    			printf("%d ",arr[i]);
    			
    		}
    		printf("\n");
    		*/
    		
            while(low < high && arr[low] <= base)
            {
                low ++;
            }
            Swap(arr, low, high);
            
           /* printf("%d,%d\n",low,high);*/
            
            /*for(int i=0 ; i<6 ;i++)
    		{
    			printf("%d ",arr[i]);
    			
    		}
    		printf("\n");
			*/
        }
        
        /*printf("%d ,%d\n",low,arr[low]);*/
         
        return low;
        
    }
     
    void quickSort(int arr[], int low, int high)
    {
        if(low < high)
        {
            int base =Location(arr, low, high);
            quickSort(arr, low, base - 1);
            quickSort(arr, base + 1, high);
        }
    }
     
    int main()
    {
    
        int n;
        scanf("%d\n",&n);
        int arr[n];
        int i , j;
        
        for(i = 0; i < n; i ++)
        {
            scanf("%d",&arr[i]);
        }

        quickSort(arr, 0, n-1);
        
        for(j = 0; j < n; j ++)
        {
            printf("%d ",arr[j]);
        }
        
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值