數組排序及相關各種算法

對數組中的元素進行排序,常見算法如下:

一、選擇排序算法

       選擇排序的基本思想是,每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。

public static void selectSort(int[] array) {
	int index;
	/*
	 * 需要選擇排序的次數,每次排序好一個元素,即需要排序的元素個數-1,故可從1開始排序
	 */
	for (int i = 1; i < array.length; i++) {
		// 每次排序前,將第一個數設爲起始值
		index = 0;
		/*
		 * 查找未排序的序列中的最大值, 第一個比較下標爲1的元素, 最後一個比較下標爲length-i的元素
		 */
		for (int j = 1; j <= array.length - i; j++) {
			if (array[j] > array[index]) 
				index = j;
		}
		/*
		 * 將最大值與未排序的最後一個元素交換
		 */
		int temp = array[array.length - i];
		array[array.length - i] = array[index];
		array[index] = temp;
	}
}

注:如果數組有重複值,應使用選擇排序。

       選擇排序法從數組中挑選最大值並放在數組最後,而遇到重複的相等值不會做任何處理,所以程序允許數組有重複值的情況,建議使用選擇排序法,因爲它的數據交換次數最少,相對速度也會略微提升,這取決於數組中重複值的數量。

二、冒泡排序算法

       冒泡排序的基本思想是對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把大的元素移到數組後面(也就是交換兩個元素的位置),這樣數組元素就像氣泡一樣從底部上升到頂部。

       冒泡算法在雙層循環中實現,其中外層循環控制排序輪數,要排序數組長度-1次。而內層循環主要是用於對比臨近元素的大小,以確定是否交換元素,對比和交換次數依排序輪數而減少。

public static void BubbleSort(int[] array) {
	/*
	 * 控制循環的次數,每次循環將最大的一個值排序到最後,即數組長度-1
	 */
	for (int i = 1; i < array.length; i++) {
		/*
		 * 一次冒泡過程中,比較並交換相鄰元素,從而將0到length-i範圍內的最大值傳遞到最後
		 */
		for (int j = 1; j <= array.length - i; j++) {
			if (array[j - 1] > array[j]) {
				int temp = array[j - 1];
				array[j - 1] = array[j];
				array[j] = temp;
			}
		}
	}
}

三、快速排序算法

       快速排序算法是對冒泡排序算法的一種改進,其排序速度相對較快,它的基本思想是,通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據比另外一部分的所有數據都要小,然後在按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此使整個數據變成有序序列。

public static void QuickSort(int[] array, int lowIndex, int highIndex) {
	int lo = lowIndex;
	int hi = highIndex;
	int mid;
	if (highIndex > lowIndex) {
		mid = array[(lowIndex + highIndex) / 2];
		while (lo <= hi) {
			while ((lo < highIndex) && (array[lo] < mid))
				++lo;
			while ((hi > lowIndex) && (array[hi] > mid))
				--hi;
			if (lo <= hi) {
				int temp = array[lo];
				array[lo] = array[hi];
				array[hi] = temp;
				++lo;
				--hi;
			}
		}
		if (lowIndex < hi)
			QuickSort(array, lowIndex, hi);
		if (lo < highIndex)
			QuickSort(array, lo, highIndex);
	}
}

四、直接插入算法

       插入算法是將一個記錄插入到有序數列中,使得到的新的數列仍然有序。插入排序算法的思想是,將n個有序數存放在數組a中,要插入的數爲x,首先確定x插在數組中的位置p,數組中p之後的元素都向後移一個位置,空出a(p),將x放入a(p)。這樣即可實現插入後數列仍然有序。

public static void InsertSort(int[] array) {
	int temp;          //定義臨時變量
	int j;
	/*
	 * 需要插入元素的個數,即數組長度-1
	 */
	for (int i = 1; i < array.length; i++) {
		temp = array[i];              //保存臨時變量,即將要插入的數組元素
		for (j = i - 1; j >= 0 && array[j] > temp; j--) {
			array[j + 1] = array[j];     //將比插入元素大的元素向後移
		}
		array[j + 1] = temp;
	}
}

五、使用sort方法對數組進行排序

       Arrays類位於java.util包中,它是數組的一個工具類,包含許多方法,其中sort()方法就是Arrays類提供的對數組進行排序的方法,它有很多重載格式,可以接收任何數據類型的數組並執行不同類型的排序。

注:Arrays類提供了創建、操作、搜索和排序數組的方法。在程序開發中有效利用Arrays類的各種方法來完成數組操作將大幅度提升程序的開發效率,並且Arrays類的方法時經測試的,可以避免程序開發中錯誤代碼的出現。

總結:

1>排序算法的空間複雜度是指排序算法運行所需要的額外消耗存儲空間,一般使用O()來表示,如直接插入排序法的空間複雜度爲O(1)。

2>各種排序比較,如下圖:


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