zoukankan      html  css  js  c++  java
  • [7] 算法之路

    左轴演算、中轴演算、右轴演算

    题目:

    高速排序法(quick sort)是眼下所公认最快的排序方法之中的一个(视解题的对象而定),尽管高速排序法在最差状况下能够达O(n2)。可是在多数的情况下,高速排序法的效率表现是相当不错的。


    高速排序 - 算法

    1、高速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二

    2、分别对左边与右边数列进行排序


    左轴演算:

    // 高速排序 - 左轴演算
    // 1. 附设两个指针left/right,并设最左端的数为最初枢轴pivot
    // 2. 从右向左搜索,找到第一个比pivot小的数,将其缓存进枢轴位置
    // 3. 从左向右搜索,找到第一个比pivot大的数。缓存进上一个比pivot小的数的位置程式进入2.循环
    // 4. 最后一次交换后获得的有效空位置为a[i] ,此时再将pivot赋值给a[i] 此时a[i]左边的数比a[i]小,右边的数比a[i]大
    //    再分别对其左边与左边进行高速排序
    int QuickSort2(int a[],int left,int right)
    {
    	if(left<right)
    	{
    		int i = left,j=right,pivotloc=a[left];
    		while(i < j)
    		{
    			while(i<j && a[j]>=pivotloc) j--;
    			if(i<j) a[i++]=a[j];
    
    			while(i<j && a[i]<pivotloc)i++;
    			if(i<j) a[j--]=a[i];
    			
    		}
    		a[i]=pivotloc;
    		QuickSort2(a,left,i-1);
    		QuickSort2(a,i+1,right);
    	}
    	return 0;
    }
    
    int QuickSort5(int a[],int left,int right)
    {
    	if(left<right)
    	{
    		int i = left,j=right,pivotloc=a[left];
    		while(i < j)
    		{
    			while(i<j && a[i]<=pivotloc) i++;
    			while(i<j && a[j]>pivotloc) j--;
    			
    			if(i<j)
    			{
    				SWAPER(a[i],a[j]);
    				i++;j--;
    			}
    		}
    		if(a[j]<a[left]) 
    		{
    			SWAPER(a[left],a[j]);
    		}
    		
    		QuickSort5(a,left,j-1);
    		QuickSort5(a,j,right);
    	}
    	return 0;
    }
    

    中轴演算

    // 高速排序
    int QuickSort3(int a[],int left,int right)
    {
    	int i,j,pivot;
    	if(left<right)
    	{
    		pivot=a[(left+right)/2];
    		i=left-1;
    		j=right+1;
    		while(i<j)
    		{
    			while(a[++i]<pivot) ;
    			while(a[--j]>pivot) ;
    			if(i<j) SWAPER(a[i],a[j]);
    		}
    		QuickSort3(a,left,i-1);
    		QuickSort3(a,j+1,right);
    	}
    	
    	return 0;
    }
    


    右轴演算

    // 高速排序演算
    // 1. 首先选择最右边的元素作为枢轴pivot
    // 2. 从左向右搜索,寻找小于pivot的数,将其与左边第一个未交换的元素交换
    // 3. 当搜索到最右边时,左边已交换的数都比pivot小。而未交换的都比pivot大
    // 4. 将左边的第一个未交换的元素与最右边的pivot元素交换,并返回该未交换元素的索引
    
    // 此时i左边的元素比i小,右边的比i大
    // 程式进入.循环分别对0 →i -1  及最右边的i+1→right进行递归(高速排序) 终于该序列会变为有序
    int Partition2(int a[],int left,int right)
    {
    	int i = left,j;
    	int pivot=a[right];
    	for(j=left;j<right;j++)
    	{
    		if(a[j]<pivot)
    		{
    			if(i!=j)SWAPER(a[i],a[j]);	
    			i++;
    		}
    	}
    	if(i!=right)SWAPER(a[i],a[right]);
    	return i;
    } 
    int QuickSort4(int a[],int left,int right)
    {
    	int pivot;
    	if(left<right)
    	{
    		pivot=Partition2(a,left,right);
    		QuickSort4(a,left,pivot-1);
    		QuickSort4(a,pivot+1,right);
    	}
    	return 0;
    }
    



  • 相关阅读:
    json转实体,json转List实体,json转泛型实体
    java使用google开源工具实现图片压缩
    SpringBoot的文件下载
    SpringBoot(三):文件下载
    java transient关键字作用,使用场景。
    ApplicationContextAware接口的作用
    JAVA中STATIC{}语句块详解
    RGB转灰度图的几种算法
    JavaScript系列文章:谈谈let和const
    mybatis中的#{}和${}区别
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6944736.html
Copyright © 2011-2022 走看看