快速排序和歸併排序的相同點和不同點(JAVA)

首先我們貼出來快速排序的代碼

public class QuickSort {
	public int QuickSort(int[] a, int left, int right) {
		int temp = a[left];
		while(left < right)
		{
			while(left < right && a[right] >= temp)
			{
				right--;
			}
			if(left < right && a[right] < temp)
			{
				a[left] = a[right];
			}
			while(left < right && a[left] <= temp)
			{
				left++;
			}
			if(left < right && a[left] > temp)
			{
				a[right] = a[left];
			}
		}
		a[left] = temp;
		
		return left;
	}
	public void partion(int a[], int left, int right) {
		int num;
		if(left < right)
		{
			num = QuickSort(a, left, right);
			partion(a, left, num-1);
			partion(a, num + 1, right);
		}
	}
	public static void main(String[] args) {
		int a[] = {7, 2, 3, 8, 9, 6, 5, 1, 4};
		QuickSort test = new QuickSort();
		test.partion(a, 0, 8);
		for(int i = 0; i < 9; i++)
		{
			System.out.print(a[i]);
		}

	}
	
}

其次我們貼出歸併排序的代碼 

public class MergeSort {
	public void merge(int[] a, int left, int right) {
		if(left + 1< right) {
			int mid = (left + right) / 2;
			merge(a, left, mid);
			merge(a, mid, right);
			mergesort(a, left, mid, right);
		}
	}
	public void mergesort(int[] a, int left, int mid, int right) {
		int testl[] = new int[10000];
		int testr[] = new int[10000];
		int n1 = mid - left;
		int n2 = right - mid;
		testl[n1] = Integer.MAX_VALUE;
		testr[n2] = Integer.MAX_VALUE;
		int num = right - left;
		for(int i = 0; i < n1; i++)	testl[i] = a[left + i];
		for(int i = 0; i < n2; i++)	testr[i] = a[mid + i];
		int i = 0;
		int j = 0;
		for(int k = left; k < right; k++)
		{
			if(testl[i] < testr[j])
			{
				a[k] = testl[i];
				i++;
			}
				
			else
			{
				a[k] = testr[j];
				j++;
			}		
		}
	}
	public static void main(String[] args) {
		int[] a = {7, 2, 3, 8, 9, 6, 5, 1, 4};
		MergeSort test = new MergeSort();
		test.merge(a, 0, 9);
		for(int i = 0; i < 9; i++)
			System.out.print(a[i]);
	}
}

閱讀完這兩個代碼,我們可以發現這兩種排序都存在遞歸,而差別則在於它們遞歸的順序。

歸併排序:是先遞歸在排序

快速排序:是先找到分割的標誌來將數組進行大致的切割(標誌的左邊都是小於標誌的值,右邊都是大於標誌的值),然後再進行遞歸

當然這兩種排序的時間複雜度和空間複雜度也不相同

快速排序的時間複雜度爲最快情況爲O(nlogn),最壞情況爲O(n*n),小計快速排序是冒泡排序的思想改進,快速排序是從整體到部分再到個體,而冒泡排序則是一個個個體去比較,所以快速排序更爲高級,當然因爲追求過快,而導致不穩定,最壞情況的出發條件則是一個有序的數組,且取得標誌爲數組的最大值或者最小值,這種情況也可能會導致棧遞歸過深,導致棧溢出,空間複雜度O(logn);

歸併排序的時間複雜度最好情況最壞情況都爲O(nlogn)。空間複雜度O(n)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章