排序知識筆記

排序分類:內部排序和外部排序算法

內部排序:只使用內存 外部排序:內存和空間結合使用數組

內部排序:一、插入排序(直接插入排序、希爾排序) 二、選擇排序(簡單選擇排序、堆排序) 三、交換排序(冒泡排序、快速排序)四、歸併排序 五、分配排序(箱排序、基數排序)ui

所需輔助空間最多:歸併排序 所需輔助空間最小:堆排序 平均速度最快: 快速排序 不穩定: 快速排序、希爾排序、堆排序code

選擇排序算法根據如下三點來選擇排序算法: 一、數據的模塊 二、數據的類型 三、數據已有的順序排序

當規模較小時選擇直接插入排序或者冒泡排序,當數據量較小時候對於任何算法來講體現不出來差別性。 若是全是正整數優先選擇桶排序 當數據已有順序,選擇冒泡排序,若是是大量的隨機數據選擇快速排序(不穩定)。遞歸

各類排序的實現: 1)冒泡排序內存

public static int[] BubbleSort(int[] data) {
	boolean flag = true;
	for (int i = 0; i < data.length && flag; i++) {
		flag = false;
		for (int j = 0; j < data.length - i - 1; j++) {
			if (data[j] > data[j + 1]) {
				int tmp = data[j];
				data[j] = data[j + 1];
				data[j + 1] = tmp;
				flag = true;
			}
		}
	}
	return data;
}

2)快速排序get

public static int[] quickSort(int[] data) {
	if (data.length > 0) {
		quickSortCore(data, 0, data.length - 1);
	}
	return data;
}

private static void quickSortCore(int[] list, int low, int high) {
	if (low < high) {
		int middle = getMiddle(list, low, high); // 將list數組進行一分爲二
		quickSortCore(list, low, middle - 1); // 對低字表進行遞歸排序
		quickSortCore(list, middle + 1, high); // 對高字表進行遞歸排序
	}
}

private static int getMiddle(int[] list, int low, int high) {
	int tmp = list[low]; // 數組的第一個做爲中軸
	while (low < high) {
		while (low < high && list[high] >= tmp) {

			high--;
		}
		list[low] = list[high]; // 比中軸小的記錄移到低端
		while (low < high && list[low] <= tmp) {
			low++;
		}
		list[high] = list[low]; // 比中軸大的記錄移到高端
	}
	list[low] = tmp; // 中軸記錄到尾
	return low; // 返回中軸的位置
}
相關文章
相關標籤/搜索