天天看點

排序算法二:選擇排序

直接選擇排序

直接選擇排序的思路是(為友善,我們仍讨論從小到大的順序排序),從前向後比較,第一輪将首位的值與後面的值依次比較,如果首位的值比後面的值大,那麼二者相交換,直到全部比較完畢為止。第一輪即可獲得該隊列的最小值,次輪則可獲得該隊列的次小值,以此類推,并最終得到結果。 下面是Java代碼

/**
	 * 直接選擇排序
	 * @param data
	 */
	private static void directSelectSort(int[] data) {
		if (null == data || data.length <= 1) {
			return;
		}
		for (int i = 0; i < data.length; i++) {
			for (int j = i+1; j < data.length; j++) {
				if (data[i]>data[j]) {
					swap(data, i, j);
				}
			}
		}
	}

	/**
	 * 數組内 i 坐标元素與 j 坐标元素互換
	 * @param data
	 * @param i
	 * @param j
	 */
	private static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;	
	}
           

選擇排序

直接選擇排序同冒泡排序看起來差別不大,并且效率上幾乎一樣。因為始終每一輪我們要把最小的元素放在我們的我們所需要的位置,是以,我們隻需要關心那個最小元素所在的位置以及我們所希望它所在的位置(即目的地)即可。于是,選擇排序無需做如此多的交換,而隻需要将每一輪最小的元素的坐标記下來與我們的目的坐标的元素交換即可。

/**
	 * 選擇排序
	 * @param data
	 */
	private static void selectSort(int[] data) {
		
		if (null == data || data.length <= 1) {
			return;
		}
		
		for (int i = 0; i < data.length; i++) {
			int min = i;
			for (int j = i+1; j < data.length; j++) {
				if (data[min]>data[j]) {
					min = j;
				}
			}
			System.out.println(min);
			if (min != i) {
				swap(data, min, i);
			}
		}	
	}

	/**
	 * 數組内 i 坐标元素與 j 坐标元素互換
	 * @param data
	 * @param i
	 * @param j
	 */
	private static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;	
	}
           

選擇排序每一輪至多進行一次交換,相較于直接選擇排序和冒泡排序其效率已經提升了很多。