排序算法复习

比较常见的算法:冒泡排序、选择排序、插入排序、快速排序。具体实现如下:

public class SortUtil {

	public static void main(String[] args) {
		int[] a={32,12,3,45,31,30,5,1,40};
		//InsertSort(a);
		//BubbleSort(a);
		//SelectSort(a);
		QuickSort(a, 0, a.length-1);
		printData(a);
	}
	
	/**
	 * 快速排序
	 * @param a
	 * @param low
	 * @param high
	 */
	public static void QuickSort(int[] a,int low,int high){
		if(low < high){
			int middle = GetMiddle(a, low, high);
			QuickSort(a, 0, middle-1);
			QuickSort(a, middle+1, high);
		}
	}
	
	/**
	 * 获取分隔下标
	 * @param a
	 * @param low
	 * @param high
	 */
	public static int GetMiddle(int[] a,int low,int high){
		if(low < high){
			int temp = a[low];
			while(low<high){
				while(low < high && temp < a[high]){
					high--;
				}
				a[low]=a[high];
				while(low<high && temp > a[low]){
					low++;
				}
				a[high]=a[low];
			}
			a[low]=temp;
		}
		return low;
	}
	
	/**
	 * 选择排序
	 * 原理:一种简单直观的排序方法,每次寻找序列中的最小值,然后放在最开始的位置。
	 * 1)在未排序数组中找到最小元素,存放到排序序列的起始位置;
	 * 2)再从剩余的未排序的数组中继续寻找最小的元素,然后放到排序数组的末尾;
	 * 3)以此类推,直到数组所有元素排序完毕。
	 * @param a
	 */
	public static void SelectSort(int[] a){
		for(int i=0;i<a.length-1;i++){
			int min=a[i];
			int index = i;
			for(int j=i+1;j<a.length;j++){
				if(min > a[j]){
					min=a[j];
					index=j;
				}
			}
			int temp = a[index];
			a[index]=a[i];
			a[i]=temp;
		}
	}
	
	/**
	 * 冒泡排序
	 * 比较相邻的两个元素,如果第一个比第二个大,则交换两个元素的位置
	 * 对每一对相邻的元素做如上的操作,比较结束后,最大的元素会被移动到最后。
	 * 再次遍历时,最后一个元素不用参与比较了,此时数组的长度减1,
	 * 针对剩余的元素重复上述步骤,直到剩余数组的长度为0;
	 * @param a
	 */
	public static void BubbleSort(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;
				}
			}
		}
	}
	
	/**
	 * 插入排序
	 * 原理:通过构建有序数据,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
	 * 1)默认该数组已经是有序的;
	 * 2)从下标1开始,取出下标1的值,在已排序的数组中,从当前下标开始,从后向前扫描;
	 * 3)如果该元素小于新元素,将新元素向后移动一个位置;
	 * 4)重复步骤3,直到找到该元素大于新元素或已扫描到开始端;
	 * 5)将该元素插入到新位置中;
	 * 6)下标加1,重复步骤2;
	 * @param a
	 */
	public static void InsertSort(int[] a){
		for(int i=1;i<a.length;i++){
			int j=i;
			int min=a[i];
			while(j>0 && min < a[j-1]){
				a[j]=a[j-1];
				j--;
			}
			a[j]=min;
		}
	}
	
	/**
	 * 打印数组
	 * @param a
	 */
	private static void printData(int[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}

 

猜你喜欢

转载自sunjianfeng610.iteye.com/blog/2238079