zoukankan      html  css  js  c++  java
  • 排序算法:快排、堆排、归并

    快排:

    基本原理思想:

    1:取标准。

    2:从尾部看,大于则减减。小于,则把j位置的值给i位置,并把i++;

    3:从头部看,小于则加加。大于,则把i位置的值给j位置,并把j--;

    4:把base赋值给最后一个i位置。

    5:递归调用。

    代码:

    #include <iostream>
    using namespace std;
    
    int findBaseIndex(int a[],int l,int r)
    {
        if(l<r)
    	{
    	    int base=a[l];
    		int i=l,j=r;
    		while(i<j)
    		{
    		    while(a[j]>base && i<j)
    				j--;
    			if(i<j)
    			{
    			    a[i]=a[j];
    				i++;
    			}
    			else
    				break;
    			while(a[i]<base && i<j)
    				i++;
    			if(i<j)
    			{
    			    a[j]=a[i];
    				j--;
    			}
    			else
    				break;
    		}
    		a[i]=base;
    		return i;
    	}
    }
    
    void quickSort(int a[],int l,int r)
    {
    	if(l<r)
    	{
            int index=findBaseIndex(a,l,r);
    		if(index>l)
    		    quickSort(a,l,index-1);
    		if(index<r)
    			quickSort(a,index+1,r);
    	}
    }
    
    int main()
    {
    	int a[]={20,59,4,93,47,1,37};
    	int len=sizeof(a)/sizeof(a[0]);
    	int l=0,r=len-1;
    	quickSort(a,l,r);
    	for(int i=0;i<len;i++)
    	{
    	    cout<<a[i]<<" ";
    	}
        return 0;
    }  
    

    过程中犯下的错误:溢出。ij的值一直控制不好。

    归并:

    基本原理思想:

    1、递归调用mergeSort(),进行分区,结束条件是分区内只有一个元素(即ij相等)。

    2、创建临时分区,把相邻分区进行合并。

    3、合并到一个临时分区时,分三种情况:相邻分区相继到末尾;或者前面的分区先结束;或者后面的分区先结束。

    代码:

    #include <iostream>
    using namespace std;
    
    void merge(int a[],int mid,int l,int r)
    {
    	int tmpsize = r-l+1;
    	int *tmp = new int[tmpsize];    //new 在堆上动态开辟内存空间。
    	int i=l;
    	int j=mid+1;
    	int k=0;
    	while(i<=mid && j<=r)       // 这里注意:::i<mid而不是i<l
    	{
    	    if(a[i]<=a[j])
    		{
    		    tmp[k++]=a[i++];
    		}
    		else
    		{
    		    tmp[k++]=a[j++];
    		}
    	}
    	while(i<=mid)
    	{
    	    tmp[k++]=a[i++];
    	}
    	while(j<=r)
    	{
    	    tmp[k++]=a[j++];
    	}
    	for(int i=0;i<k;i++)
    	{
    	    a[l++]=tmp[i];
    	}
    	delete[] tmp;
        return;
    }
    
    void mergeSort(int a[],int l,int r)
    {
    	if(a==NULL || l==r)     //这是结束条件
    		return;
    	int mid=(l+r)/2;
    	mergeSort(a,l,mid);
    	mergeSort(a,mid+1,r);
    	merge(a,mid,l,r);
        return;
    }
    
    int main()
    {
    	int a[]={10,8,17,4,16,19,30,2};
    	int len = sizeof(a)/sizeof(a[0]);
    	int l=0,r=len-1;
    	mergeSort(a,l,r);
    	for (int i=0; i<len; i++)
            cout << a[i] << " ";
        cout << endl;
    	return 0;
    } 
    

      

  • 相关阅读:
    Android 弹性布局 FlexboxLayout了解一下
    设计模式——适配器模式
    UML类图中的六种关系(物理设计阶段)
    设计模式——策略模式
    Kaggle-tiantic数据建模与分析
    数据预处理—独热编码
    推荐系统-协同过滤
    推荐系统实战-冷启动问题
    推荐系统-协同过滤原理与实现
    Hadoop生态系统之Yarn
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/9369006.html
Copyright © 2011-2022 走看看