深入理解各种排序


排序算法是很多公司面试或者笔试时候的必出题,也是会在自己今后道路上解决排序问题的重中之重。很多人在毕业后由于不怎么接触算法可能都忘记了。今天抽了点时间写了部分常用排序算法的理解和实例,希望大家能喜欢! 话不多说 直接上代码解释吧   

public class SortArray {

	/***
	 * 冒泡排序  n个人
	 *@description a[0]-a[n-1]比较: 从a[0] 和a[1] 开始比较 如果a[0]>a[1] 则a[0]和a[1]位置互换 再比较a[1]和a[2]
	 * ....最后比较a[n-2]和a[n-1] 这样一轮下来a[n-1] 一定是这数组中最大的 。再对a[0]-a[n-2]同样方法排序....
	 * @param array
	 * 时间复杂度 从前依次往后比较次数分别为(n-1)+(n-2)+....+1 =n*(n-1)/2  O(n2)
	 * 空间复杂度 一个数组 n 也就是O(1)
	 * 稳定性 : 稳定
	 */
	public static void BubbleSort(int[] array){
		//从前往后第一个开始
//		for(int i=0;i<array.length-1;i++){
//			for(int j=0;j<array.length-i-1;j++){
//				int temp=0;
//				if(array[j]>array[j+1]){
//					temp =array[j];
//					array[j]=array[j+1];
//					array[j+1]=temp;
//				}
//			}
//		}
		//从后往前 第a[n-1] 和a[n-2] 比较 若a[n-1]>a[n-2] 则交换位置 a[n-2]和a[n-2]同理,知道a[1]和a[0] 第一轮比较结束 ;
		//第二轮从第a[n-1]-a[1] 依旧
		//每i轮a[i-1] 一定是这组数中最小的值
		for(int i=0;i<array.length;i++){//第i+1次排序
			for(int j=array.length-1;j>i;j--){ //每i轮排序从a[i-1] -a[array.length-1]开始
				if(array[j]<array[j-1]){
					int temp =array[j-1];
					array[j-1]=array[j];
					array[j]=temp;
				}
			}
		}
	}
	
	/***
	 * 选择排序
	 * @author :yuzg 
	 * @Description:已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。
	 * 首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。
	 * 这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。
	 * 再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。 注:a[1] 相当于第一个数array[0]
	 * @param array
	 * 思路:每一轮先找到数组中最小值的下标 然后和当前的还没排好序的第一个换
	 */
	public static void selectionSort(int[] array){
		if(array.length<2){
			return;
		}
		for(int i=0;i<array.length;i++){
			int min_index=Integer.MIN_VALUE;
			for(int j=i+1;j<array.length;j++){
				if(array[i]>array[j]){
					min_index=j;
				}else{
					min_index=i;
				}
			}
			if(min_index !=i){
				int temp=array[i];
				array[i]=array[min_index];
				array[min_index]=temp;
			}
		}
	}
	
	/***
	 * 插入排序
	 * @author :yuzg 共n个元素
	 * @Description:从第二个数字开始和前面的进行比较。找到合适的插入位置ax处(就像我们平常抓牌 ,抓下一张牌后,会把这张牌依次与左手上的牌比较)
	 *  从i-1->x 依次往后退一位,ai 移到x处
	 * @param array
	 * 时间复杂度:从前往后:1+2+3+(n-1) =O(n2)
	 * 空间复杂度 O(1) 
	 * 优点:稳定,快;

	       缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
	 */
	public static void insertSort(int[] array){
		int i,j;
		for( i=1;i<array.length;i++){ //从a[1](第二个元素)开始  查找前面需要插入的地方
//			for(j=i-1;j>=0&&array[i]<array[j];j--){//找到x(要插入的下标) 即j最后的值
//				
//			} //上面的for 等价于:
			for(j=i-1;j>=0;){//找到x(要插入的下标) 即j最后的值
				if(array[i]>=array[j]){
					break;
				}else{ //即array[i]<array[j] 
					j--;
				}
				
			}
			//此地注意 因为满足array[i]<array[j] 后还要j-- 所以此时 ai 应该插入到aj后面一位
			//从i-1->x都往后移动一位
			int temp =array[i];
			for(int k=i;k>j;k--){
				array[k]=array[k-1];
			}
			array[j+1]=temp;
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array={1,3,2,45,6,8,7};
//		BubbleSort(array);
//		selectionSort(array);
		insertSort(array);
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
	}

}


发布了27 篇原创文章 · 获赞 46 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章