排序

1.插入排序
原理:将原序列视作两个序列:单独由第一个元素组成的有序序列和由其余元素组成的无序序列,依次将无序元素与有序元素(依倒序)比较并插入。
代码:
public class InsertSort {

public void sort(int[] a){
	for(int i=1; i<a.length; i++){
		if(a[i]<a[i-1]){
			int index = i-1;
			int temp = a[i];
			while(index>=0&&temp<a[index]){
				a[index+1] = a[index];
				index--;
			}
			a[index+1] = temp;
		}
	}
}

}

2.选择排序
原理:从序列中选出最小(最大)值与第一个元素交换次序,再从其余元素中选择最小(最大)值与第二个元素交换次序,依此类推。
代码:
public class SelectionSort {

public void sort(int[] a){
	for(int i=0; i<a.length-1; i++){
		int min = a[i], index = i;
		for(int j=i+1; j<a.length; j++){
			if(a[j]<min){
				min = a[j];
				index = j;
			}
		}
		a[index] = a[i];
		a[i] = min;
	}
}

}

3.冒泡排序
原理:重复依次比较序列中相邻的无序元素,若次序不符合要求,交换两者次序,每一次遍历减少一个无序元素。
代码:
public class BubbleSort {

public void sort(int[] a){
	for(int i=0; i<a.length-1; i++){
		for(int j=0; j<a.length-1-i; j++){
			if(a[j]>a[j+1]){
				int temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
}

}

4.快速排序
原理:选取基准元素(第一个元素),将其余原序列元素依次与基准元素比较,分成小于和大于基准元素的两个序列,再对这两个序列作同样处理。
代码:
public class QuickSort {

public void swap(int[] a, int i, int j){
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}

public void sort(int[] a){
	sort(a, 0, a.length-1);
}

public void sort(int[] a, int beg, int end){
	if(a.length>1){
		int pivot = a[beg];
		int index_s = beg, index_b = end, count = 0;
		for(int i=beg+1; i<=end; i++){
			while(a[i]>pivot){
				swap(a, i, index_b);
				index_b--;
				if(index_b-index_s==count){
					break;
					}
			}
			if(a[i]<pivot){
				swap(a, i, index_s);
				index_s++;
			}else if(a[i]==pivot){count++;}
			if(index_b-index_s==count){
				break;
			}
		}
		if(index_s-beg>1){sort(a, beg, index_s-1);}
		if(end-index_b>1){sort(a, index_b+1, end);}
	}
}

}

5.希尔排序
原理:选择末尾元素为1的递减步长(gap)序列,重复将原系列分成gap个子序列并分别作插入排序处理。
代码:
public class ShellSort {

public void insertsort(int[]a, int gap, int count){
	for(int i=gap+count; i<a.length; i+=gap){
		if(a[i]<a[i-gap]){
			int index = i-gap;
			int temp = a[i];
			while(index>=count&&temp<a[index]){
				a[index+gap] = a[index];
				index -= gap;
			}
			a[index+gap] = temp;
		}
	}
}

public void sort(int[] a){
	int gap = a.length/2;
	while(gap>0){
		for(int i=0; i<gap; i++){			
			insertsort(a, gap, i);	
		}
		gap /= 2;
	}
}	

}

6.堆排序
原理:将序列建立为大顶堆,重复将堆顶元素和无序部分末尾元素交换,恢复大顶特性这两个步骤直至所有元素有序。
代码:
public class HeapSort {

public void adjust(int[] a, int index, int len){
	if(2*index+2<len){
		if(a[index]<a[2*index+1]||a[index]<a[2*index+2]){
			int temp = a[index];
			if(a[2*index+1]>a[2*index+2]){
				a[index] = a[2*index+1];
				a[2*index+1] = temp;
				adjust(a, 2*index+1, len);
			}else{
				a[index] = a[2*index+2];
				a[2*index+2] = temp;
				adjust(a, 2*index+2, len);
			}
		}
	}else if(2*index+1<len&&a[index]<a[2*index+1]){
		int temp = a[index];
		a[index] = a[2*index+1];
		a[2*index+1] = temp;
		adjust(a, 2*index+1, len);
	}
}

public void sort(int[] a){
	for(int i=(a.length-1)/2; i>=0; i--){
		adjust(a, i, a.length);
	}
	for(int i=a.length-1; i>0; i--){
		int temp = a[i];
		a[i] = a[0];
		a[0] = temp;
		adjust(a, 0, i);
	}
}

}

7.归并排序
原理:原序列分成若干子序列,先使子序列有序,再合并有序的子序列。
代码:
public class MergeSort {

public void merge(int[] a, int beg1, int end1, int end2){
	int[] b = new int[end2-beg1+1];
	int index1 = beg1;
	int index2 = end1+1;
	int index = 0;
	while(index1<=end1&&index2<=end2){
		if(a[index1]<a[index2])   b[index++] = a[index1++];
		else   b[index++] = a[index2++];
	}
	if(index2>end2){
		for(int i=0; i<=end1-index1 ; i++)   a[end2-i] = a[end1-i];
	}
	for(int i=0; i<index; i++)   a[i+beg1] = b[i];
}

public void sort(int[] a){
	int len = 1;
	while(len<a.length){
		int rem = a.length;
		while(rem>len){
			int beg1, end1, end2;
			beg1 = a.length-rem;
			end1 = a.length-rem+len-1;
			if(rem>=2*len){
				end2 = a.length-rem+2*len-1;
			}else{end2 = a.length-1;}
			merge(a, beg1, end1, end2);
			rem -= 2*len;
		}
		len *= 2;
	}
}

}

主函数代码:
public class Main {

public static void print(String str, int[] a){
	System.out.println();
	System.out.print(str+":");
	for(int i=0; i<a.length; i++){
		System.out.print(a[i]+" ");
	}
}

public static void main(String[] args) {
	int n = (int) (Math.random()*100+1);
	int[] arr = new int[n];
	int[] a = new int[n];
	int[] b = new int[n];
	int[] c = new int[n];
	int[] d = new int[n];
	int[] e = new int[n];
	int[] f = new int[n];
	int[] g = new int[n];
	for(int i=0; i<n; i++){
		arr[i] = (int) (Math.random()*100+1);
		a[i] = arr[i];
		b[i] = arr[i];
		c[i] = arr[i];
		d[i] = arr[i];
		e[i] = arr[i];
		f[i] = arr[i];
		g[i] = arr[i];
	}
	System.out.print("序列长度:"+n);
	print("未排序列", arr);
	InsertSort ins = new InsertSort();
	ins.sort(a);
	print("插入排序", a);
	SelectionSort sec = new SelectionSort();
	sec.sort(b);
	print("选择排序", b);
	BubbleSort bub = new BubbleSort();
	bub.sort(c);
	print("冒泡排序", c);	
	QuickSort qui = new QuickSort();
	qui.sort(d);
	print("快速排序", d);
	ShellSort she = new ShellSort();
	she.sort(e);
	print("希尔排序", e);	
	MergeSort mer = new MergeSort();
	mer.sort(f);
	print("归并排序", f);
	HeapSort hea = new HeapSort();
	hea.sort(g);
	print(" 堆 排 序 ", g);
}

}

此博文系原创 转载需获取作者许可

posted @ 2017-01-22 00:18  流水-_-  阅读(189)  评论(0编辑  收藏  举报