JL BLOG CS Lover

Sort

2018-05-18
JiefanLee

阅读:


Selection sort


public class SelectionSort {

	public static void main(String[] args) {
		int a[]= {1,2,1,3,1,3,7,2,1};
		// TODO Auto-generated method stub
		int temp,flag;
		for(int i=0;i<a.length-1;++i)
		{
			flag=i;
			for(int j=i+1;j<a.length;++j)
			{
				if(a[flag]>a[j])
				{
					flag=j;
				}
			}
			temp=a[i];
			a[i]=a[flag];
			a[flag]=temp;

		}

		for(int i=0;i<a.length;++i)
			System.out.print(a[i]);
	}

}

Insertion Sort


public class InsertionSort {

	public static void Exc(int[] a,int i,int j)
	{
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[] = { 1, 2, 1, 3, 1, 3, 7, 2, 1 };
		for (int i = 1; i < a.length; ++i) {
			int num = i;
			while (num > 0 && a[num-1] > a[num]) {
				Exc(a, num-1, num);
				--num;
			}
		}
		for (int i = 0; i < a.length; ++i)
			System.out.println(a[i]);
	}

}

Merge Sort


import edu.princeton.cs.algs4.Insertion;
import edu.princeton.cs.algs4.StdRandom;

public class mergeSort {
	public static void merge(int a[],int lo,int mid,int hi)
	{
		int aux[]=new int[a.length];//使用一个新的数组存储原来的元素
		for(int i=lo;i<=hi;++i)
			aux[i]=a[i];
		int i=lo,j=mid+1;
		for(int k=lo;k<=hi;++k)//需要把a数组再次填满,所以从lo到hi进行
		{
			if(i>mid)
				a[k]=aux[j++];
			else if(j>hi)
				a[k]=aux[i++];
			else if(aux[i]>aux[j])
				a[k]=aux[j++];
			else
				a[k]=aux[i++];
		}
	}

	public static void sort(int a[],int lo,int hi)
	{

		if(lo>=hi)
		{
			return;//不要忘记了return的情况,否则数不出结果
		}
		int mid=(lo+hi)/2;
		sort(a, lo, mid);//先sort两边,再merge
		sort(a, mid+1, hi);
		if(a[mid]<=a[mid+1])
			return;
		merge(a, lo, mid, hi);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[]= new int[1000];
		for(int i=0;i<1000;++i)
			a[i]=StdRandom.uniform(1000);
		sort(a, 0, a.length-1);
		for(int i:a)
			System.out.println(i);
	}

}

Quick Sort

快速排序是典型的分治思想算法。每一遍排序都从序列中取一个值,以此值为key分区,分区后使这个值左边的数都小于等于这个值,右边的都大于等于这个值,这样把整个序列分为两部分,再对这两部分分别递归执行上述操作。

该方法的基本思想是:
1.先从数列中取出一个数作为key。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
import edu.princeton.cs.algs4.StdRandom;

public class quickSort {

	public static void sort(int a[],int lo,int hi)
	{
		if(lo>=hi)
			return;
		int key=a[lo],i=lo,j=hi;
		while(i!=j)//不断重复,直到最后比target小的全在左边而比target大的全在右边
		{
			while(i<j&&a[j]>=key)//找到左边比target大的数
				--j;
			while(i<j&&a[i]<=key)//找到右边比target小的数
				++i;
			int temp=a[i];//交换两个数
			a[i]=a[j];
			a[j]=temp;
		}
		a[lo]=a[i];
		a[i]=key;
		sort(a, lo, i-1);
		sort(a, i+1, hi);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[]=new int [1000];
		for(int i=0;i<1000;++i)
			a[i]=StdRandom.uniform(1000);
		sort(a, 0, a.length-1);
		for(int i:a)
			System.out.println(i);
	}
}

Similar Posts

上一篇 Convex

Comments