zoukankan      html  css  js  c++  java
  • 排序算法

    一、归并排序

    #include <bits/stdc++.h>
    using namespace std;
    int a[1009],temp[1009],n,ans;
    void merge(int a[],int l,int mid,int r,int temp[])
    {
    	int p1=l,p2=mid+1,num=l;
    	while(p1<=mid&&p2<=r)
    	{
    		if(a[p1]<=a[p2])		temp[num++]=a[p1++];
    		else	temp[num++]=a[p2++],ans+=mid-p1+1;
    		//若想用归并排序求逆序对,当a[p1]>a[p2]时,p1到mid的元素一定和a[p2]形成逆序对,即ans+=mid-p1+1;
    	}
    	while(p1<=mid)	temp[num++]=a[p1++];
    	while(p2<=r)	temp[num++]=a[p2++];
    	for(int i=l;i<=r;i++)
    		a[i]=temp[i];
    	return;
    }
    void mergesort(int a[],int l,int r,int temp[])
    {
    	if(l<r)
    	{
    	int mid=(l+r)/2;
    	mergesort(a,l,mid,temp);
    	mergesort(a,mid+1,r,temp);
    	merge(a,l,mid,r,temp);
    	}
    }
    int main()
    {
    	cin>>n;
    	int ans=0;
    	for(int i=1;i<=n;i++)	cin>>a[i];
    	mergesort(a,1,n,temp);
    }
    

    二、快速排序

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int a[10009];
    void swap(int &a,int &b)
    {
    	int temp=a;a=b;b=temp;
    	return;
    }
    void quicksort(int a[],int l,int r)
    {
    	if(l>=r)	return;
    	int i=l,j=r,k=a[l];//把比K小的移到左边,大的右边 
    	while(i!=j)
    	{
    		while(j>i&&k<=a[j])	j--;
    		swap(a[i],a[j]);
    		while(j>i&&a[i]<=k)	i++;
    		swap(a[i],a[j]);		
    	}
    	quicksort(a,l,i-1);
    	quicksort(a,i+1,r);
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)	cin>>a[i];
    	quicksort(a,1,n);
    }
    
  • 相关阅读:
    C#与C++中struct和class的小结
    C#中string的小结
    树的一些操作——遍历,前序和中序建立后续
    一个快速、高效的Levenshtein算法实现——代码实现
    整数拆分
    阶乘结果中0的个数
    普莱菲尔密码矩阵生成算法
    CTF密码学总结
    盲文对照表
    实验吧-古典密码
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12679628.html
Copyright © 2011-2022 走看看