• 高速排序优化通过中位数优化


    <span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
    //交换位置传入两个地址
    void Swap(int *a, int *b)   
    {
    	int temp;
    	temp = *b;
    	*b = *a;
    	*a = temp;
    }
    
    //求出三个数的中位数而且将pivot(keyword放在i-1的位置上)
    int Median3(int A[],int Left,int Right) //left = 起点 right = 终点
    {
    	int Center = (Left + Right) / 2;    //找出中间位置用Center存储
    	if(A[Left] > A[Center])             //保证左边比中间小
    	{
    		Swap(&A[Left],&A[Center]);
    	}
    	if(A[Left] > A[Right])              //保证右边比中间小
    	{
    		Swap(&A[Left],&A[Right]);
    	}
    	if(A[Center] > A[Right])            //保证中间比右边小
    	{
    		Swap(&A[Center],&A[Right]);
    	}
    	Swap(&A[Center],&A[Right-1]);       //将中位数藏到right-1的位置上
    	return A[Right-1];
    }
    
    //排序算法的实现传入三个參数 Left = 起点 Right = 终点
    void Quicksort(int A[],int Left,int Right)
    {
    	int Pivot = Median3(A,Left,Right);           //做子集划分的时候处理keyword
    	int i = Left;                            //不用考虑第一个和最后一个在中位数里已经处理过
    	int j = Right-1;
    
        //子集划分不断循环
    	while(1)
    	{
    		while ( A[ ++i ] < Pivot ) { }
    		while ( A[ --j ] > Pivot ) { }
    		if ( i < j )
    			Swap( &A[i], &A[j] );
    		else break;
    	}
    	Swap(&A[i],&A[Right-1]);         //继续藏位置
    	if(Left < i-1)
    	Quicksort(A,Left,i-1);           //从中间位置到初始位置
    	if(i+1 < Right)                  //注意这里是三个数已排好了
    	Quicksort(A,i+1,Right);          //两个递归所以两个推断条件
    }
    
    //对快排进行封装
    void Quick_Sort(int A[],int N)
    {
    	Quicksort(A,0,N-1);
    }
    
    int main()
    {
    	int a[14] = {10,7,2,5,3,4,9,11,15,12,20,902,50,30};
    	Quick_Sort(a,14);
    	for(int i=0;i<14;i++)
    	{
    		printf("%d ",a[i]);
    	}
    	getchar();
    }

  • 相关阅读:
    NOIp2018集训test-9-23
    NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
    NOIp2018集训test-9-21(am/pm)
    NOIp2018集训test-9-19(am&pm)
    day41.txt
    day40表关系
    day39
    day38数据库
    day37
    day36
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6792119.html
Copyright © 2020-2023  润新知