各種排序算法的總結

一、交換排序

1. 冒泡排序法

public static void bubbleSort(Object a[],int n)
{
	if(n>a.length){
		System.out.printf("êènóDó£í£13ìDò£");
		System.exit(1);
	}
	for(int i=1;i<n;i++)
	{
		boolean flag=false;
		for(int j=n-1;j>=i;j--)
		{
			if(((Comparable)a[j]).compareTo(a[j-1])<0){
				Object x=a[j];
				a[j]=a[j-1];
				a[j-1]=x;
				flag=true;
			}
		}
		if(flag==false) return;
	}
}

2. 快速排序法

public static int partition(Object a[],int s,int t)
{
	int i=s,j=t;
	Object x=a[i++];
	while(i<=j){
		while(i<=j&&((Comparable)a[i]).compareTo(x)<=0) i++;
		while(i<=j&&((Comparable)a[j]).compareTo(x)>=0) j--;
		if(i<j){
			Object temp=a[i];
			a[i]=a[j];
			a[j]=temp;
			i++;
			j--;
		}
	}
	a[s]=a[j];a[j]=x;
	return j;
}
public static void quickRecursion(Object a[],int s,int t)
{
	int j=partition(a,s,t);
	if(s<j-1) quickRecursion(a,s,j-1);
	if(j+1<t) quickRecursion(a,j+1,t);
}
public static void quickSort(Object a[],int n)
{
	if(n>a.length) {System.out.println("nμóDó£í£1DD£"); system.exit(1);}
	quickRecursion(a,0,n-1);
}

二、 插入排序法

public static void insertSort(Object[] a,int n)
{
    if(n>a.length)
    {
        System.out.println("n值有誤,停止執行!");
        System.exit(1);
    }
    for(int i=1;i<n;i++)
    {
        Object x=a[i];
        int j;
        for(j=i-1;j>=0;j--)
        {
            if(((Comparable)x).compareTo(a[j])<0)
                a[j+1]=a[j];
            else break;
        }
        a[j+1]=x;
    }
}

三、選擇排序

public static void selectSort(Object []a,int n)
{
    if(n>a.length)
    {
        System.out.println("n值有誤,停止執行!");
        System.exit(1);
    }
    for(int i=1;i<=n-1;i++)
    {
        int k=i-1;
        for(int j=i;j<=n-1;j++)
        {
            if(((Comparable)a[j]).compareTo(a[k])<0)
                k=j;

        }
        if(k!=i-1)
        {
            Object x=a[i-1];
            a[i-1]=a[k];
            a[k]=x;
        }
    }
}

四、歸併排序

public static void twoMerge(Object []a,Object []r,int s,int m,int t)
{
    int i,j,l;
    i=s;j=m+1;k=s;
    while(i<m&&j<=t)
    {
        if(((Comparable)a[i]).compareTo(a[j])<=0)
        {
            r[k]=a[i];i++;k++;
        }
        else
        {
            r[k]=a[j];j++;k++;
        }
    }
    while(i<=m)
    {
        r[k]=a[i];i++;k++;
    }
    while(j<=t)
    {
        r[k]=a[j];
        j++;k++;
    }
}
public static void mergePass(Object []a,Objcet []r,int n,int len)
{
    int p=0;
    while(p+2*len-1<n-1)
    {
        twoMerge(a,r,p,p+len-1,p+2*len-1);
        p+=2*len;
    }
    if(p+len-1<n-1)
        twoMerge(a,r,p,p+len-1,n-1);
    else
        for(int i=p;i<=n-1;i++) r[i]=a[i];
}
public static void mergeSort(Object []a,int n)
{
    Object []r=new Object[n];
    int len=1;
    while(len<n)
    {
        mergePass(a,r,n,len);
        len*=2;
        mergePass(r,a,n,len);
        len*=2;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章