zoukankan      html  css  js  c++  java
  • 改进版高速排序(平均复杂度O(NlogN))

    #include<iostream>
    using namespace std;
    
    #define MAXSIZE  21
    typedef int SqList[MAXSIZE];  
    #define   ElementType int
    void Swap(int &a, int &b)  
    {  
        a = a^b;  
        b = a^b;  
        a = a^b;  
    } 
     
    //*********************************************************
    ElementType Median3( ElementType *A, int Left, int Right )
    {
    		int Center = ( Left + Right ) / 2;
    
    		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 ] );
    		 
    		return A[ Right ]; /* 返回pivot */
    }
    
    
    void Quicksort( ElementType *A, int Left, int Right )
    {   
    	if(Left>=Right){return ;}
    	{
            int	Pivot = Median3( A, Left, Right );
    	    int	i = Left; 
    	    int j = Right;
    		 
    		  for( ;  ; )
    	 
    		{   
    			  while ( i<j && A[i] < Pivot ) {  ++i;   }  
    			  // 注意这里是>=否则当Pivot和头尾数据相等时就会死循环
    			  while ( i<j &&  A[j] >= Pivot ) { --j;   }  
    			
    			if ( i < j )
    			Swap( A[i], A[j] );
    			else break; 
    		}
    			Swap( A[i], A[Right] );
    	  
    		   Quicksort( A, Left, i-1 );
    	       Quicksort( A, i+1, Right );
    	 
    	}
    	 
    }
    
    void Quick_Sort(ElementType *A,int N)//接口
    {
       Quicksort( A, 0, N-1 );
    }
    //////////////////////////////////////////////////////
     
    void main()
    {
    	SqList sq = {49,38, 65, 97, 76, 13, 27, 49 };
           
    	 Quick_Sort( sq,8);//
    	 	 for (int i = 0; i < 8; i++)  
        {  
    		 cout << sq[i] <<",";  
        }  
        cout << endl;
     
       
    }
    
     


    为了尽可能减少复杂度,出现了一些边界控制的问题。在老师的帮助下,完毕了代码。

    有不足之处。还望指出。

  • 相关阅读:
    图片加载库Glide
    Home键和back键下 Activity的生命周期变化
    Fragment重叠问题
    Fragment与Activiy之间的交互
    android事件拦截处理机制详解 .--------转
    实现手机QQ的抖动效果
    点评点赞功能的基本实现------个人观点
    自定义侧滑菜单
    检查设备剩余内存
    StringByAppendingPathComponent和stringByAppendingString的区别
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6744560.html
Copyright © 2011-2022 走看看