zoukankan      html  css  js  c++  java
  • 高速排序

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    void InsertionSort(int a[],int N)
    {
    	int j,p,tmp;
    
    	for(p=1;p<N;p++)
    	{
    		//1-N-1趟目标
    		tmp=a[p];
    		for(j=p;j>0 && a[j-1]>tmp;j--)
    		{
    			a[j]=a[j-1];
    		}
    		a[j]=tmp;
    	}
    }
    
    
    
    int median3(int a[],int left,int right)
    {
    	int mid=(left+right)/2;
    
    	if(a[left]>a[mid]) swap(a[left],a[mid]);
    	if(a[left]>a[right]) swap(a[left],a[right]);
    	if(a[mid]>a[right]) swap(a[mid],a[right]);
    
    	swap(a[mid],a[right-1]);
    
    	return a[right-1];
    }
    
    const int cutoff=3;
    
    void Qsort(int a[],int left,int right)
    {
    	int pivot,i,j;
    
    	//左小右
    	if(left+cutoff<=right)
    	{
    		//三数取中
    		pivot=median3(a,left,right);
    		i=left;j=right-1;
    
    		//切割
    		for(;;)
    		{
    			while(a[++i]<pivot){}
    			while(a[--j]>pivot){}
    			if(i<j)
    				swap(a[i],a[j]);
    			else
    				break;
    		}
    
    		//换回轴枢
    		swap(a[i],a[right-1]);
    
    		Qsort(a,left,i-1);
    		Qsort(a,i+1,right);
    	}
    	else
    		InsertionSort(a+left,right-left+1);
    }
    
    void main()
    {
    	int a[13]={13,12,11,10,9,8,7,6,5,4,3,2,1};
    	Qsort(a,0,12);
    	return ;
    }

  • 相关阅读:
    带外数据
    数组中的第K个最大元素
    广播和多播
    反转链表
    ioctl操作
    非阻塞式I/O
    [CSP-S模拟测试]:简单的括号序列(组合数)
    [CSP-S模拟测试]:最大异或和(数学)
    关于我
    [CSP-S模拟测试]:礼物(数学)
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7225587.html
Copyright © 2011-2022 走看看