第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

歸并排序

標(biāo)簽:
Java 算法

归并排序其实是采用的是分治算法,也就是分而治之,比如一个数组:

{13,4,5,2,65,6},首先将这个数组分成{13,4,5},{2,65,6} ,然后继续分解{13,4} {5},{2,65},{6},最后{13},{4},{5},{2},{65},{6}

递归分解多个数组后就开始比较合并,首先是13跟4比较,再合并{4,13},然后合并的就是{4,5,13},接着{2,65},{2,6,65} ,最后{2,4,5,6,13,65} ,  就是分组合并,时间复杂度是o(nlogn) ,空间复杂度是o(n);也是一种稳定的排序,在代码实现上其实跟快速排序是差不多的,只不过快排是根据一个位置分成左边小于分界点,右边大于分界点。下面看代码:

	public static void MergeSort(int []a , int start , int end,int []temp) {		
		if(start < end) {			int mid = (start + end ) / 2;
			MergeSort(a,start,mid,temp);  //左边有序
			MergeSort(a,mid+1,end,temp);  //右边有序
			MergerArray(a,start,mid,end,temp); //合并
		}
		
	}	
	//合并2个数组
	public static void MergerArray(int []a,int start , int mid , int end , int []temp) {		
		int i = start , j = end ,m = mid+1;		int count = 0;		while(i <= mid && m <= j) {			if(a[i] < a[m]) {
				temp[count++] = a[i++];
			}else {
				temp[count++] = a[m++];
			}
		}		
		while(i <= mid) {
			temp[count++] = a[i++];
		}		
		while(m <= j) {
			temp[count++] = a[m++];
 		}		
		for(int k = start, s=0 ; k <= end ; k++) {
			a[k] = temp[s++];
		}
	}

下面测试下排序的速度:

	public static void main(String[] args) {
			
		 Instant start = Instant.now();
		 int a [] = new int [10000];
		 for(int i = 0 ; i < 10000 ; i++) {
			 a[i] = 10000 - i;
		 }
		 int temp[] = new int [10000];
		 MergeSort(a,0,10000-1,temp);
		 for (int i = 0 ; i < 10000 ; i ++) {
			System.out.println(a[i] +  " ");
		 }
		 Instant end = Instant.now();
		 System.out.println("归并排序所花费的时间 :   "+Duration.between(start, end).toMillis());
	}

10000个数字进行逆序排列,对比快排:

....
9993 
9994 
9995 
9996 
9997 
9998 
9999 
10000 
归并排序所花费的时间 :   147

下面是快速排序:

public static void QuickSorted(int a[], int start , int end) {
		if(start < end) {
			int mid = Partition(a,start,end);
			QuickSorted(a, start , mid-1);
			QuickSorted(a, mid+1 , end);
		}
	}
   	
	
	private static int Partition(int[] a, int start, int end) {
		int i = start , j = end;
		int temp = a[start];
		while(i < j ) {
			while(i < j && a[j] >= temp) {
				j--;
			}
			a[i] = a[j];
			
			while(i < j && a[i] <= temp) {
				i++;
			}
			a[j] = a[i];
			
		}
		a[i] = temp;
		return i;
	}

	public static void main(String[] args) {
		
		
		 Instant start = Instant.now();
		 int a [] = new int [10000];
		 for(int i = 0 ; i < 10000 ; i++) {
			 a[i] = 10000 - i;
		 }
		 QuickSorted(a,0,10000-1);
		 for (int i = 0 ; i < 10000 ; i ++) {
			System.out.println(a[i] +  " ");
		 }
		 Instant end = Instant.now();
		 System.out.println("快速排序所花费的时间 :   "+Duration.between(start, end).toMillis());

}		
		
		

....
9992 
9993 
9994 
9995 
9996 
9997 
9998 
9999 
10000 
快速排序所花费的时间 :   193

快速排序和堆排序都是o(nlogn)的排序,下面在对比下o(n*n)的 排序,下面就以冒泡排序为例:

	private static void BubbleSorted(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;
				 }
			 }
		 }
	}

 public static void main(String []args){		
         Instant start = Instant.now();
		 int a [] = new int [100000];
		 for(int i = 0 ; i < 100000 ; i++) {
			 a[i] = 100000 - i;
		 }
		 BubbleSorted(a);
		 for (int i = 0 ; i < 100000 ; i ++) {
			System.out.println(a[i] +  " ");
		 }
		 Instant end = Instant.now();
		 System.out.println("冒泡排序所花费的时间 :   "+Duration.between(start, end).toMillis());

}

测试10万个数据:

		    99993 
			99994 
			99995 
			99996 
			99997 
			99998 
			99999 
			100000 
			冒泡排序所花费的时间 :   4417

堆排序测试10万个数据:

99992 
			99993 
			99994 
			99995 
			99996 
			99997 
			99998 
			99999 
			100000 
			归并排序所花费的时间 :   953

明显快了很多。







點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
7794
獲贊與收藏
665

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消