經常使用的簡單排序算法集合(更新中)

        /**
	 * 冒泡排序
	 */
	public static void Bubble_Sort(int[] a) {
		for (int i = 0; i < a.length - 1; i++) {
			for (int j = 0; j < a.length - i - 1; j++) {
				if (a[j] > a[j + 1]) {
					a[i] = a[i] + a[j];
					a[j] = a[i] - a[j];
					a[i] = a[i] - a[j];
				}
			}
		}
	}

	/**
	 * 選擇排序
	 */
	public static void Select_Sort(int[] a) {
		int minIndex = 0;
		for (int i = 0; i < a.length - 1; i++) {
			minIndex = i;
			for (int j = i + 1; j < a.length; j++) {
				if (a[j] < a[minIndex]) {
					minIndex = j;
				}
			}
			if (minIndex != i) {
				a[i] ^= a[minIndex];
				a[minIndex] ^= a[i];
				a[i] ^= a[minIndex];
			}
		}
	}

	// 插入排序
	public static void Insert_Sort(int[] a) {
		int length = a.length;
		int insertval = 0;
		int index = 0;
		for (int i = 1; i < length; i++) {
			insertval = a[i];
			index = i - 1;
			/**
			 * 5 4 3 2 1
			 * 4 5 3 2 1
			 * 3 4 5 2 1
			 * 2 3 4 5 1
			 * 1 2 3 4 5
			 */
			while (index >= 0 && insertval < a[index]) {
				a[index + 1] = a[index];
				index--;
			}

			a[index + 1] = insertval;
		}

	}

	/**
	 * 快速排序——雙向檢索,返回調整後key的位置
	 */
	private static void part(int l, int r, int A[]) {

		if (l < r) {
			int i = l, j = r;
			int key = A[i];// 取出收個數做爲key,挖出第一個坑
			while (i < j) {
				// 循環從末尾找到第一個比key小或等於的數的索引j
				while (i < j && A[j] > key)
					j--;

				if (i < j)
					// 將這個比key小的數填入key處的坑,造成新坑索引j,同時增長索引i
					A[i++] = A[j];
				// 循環從i開始找到第一個打大於key的數字索引i
				while (i < j && A[i] < key)
					i++;

				if (i < j)
					// 將這個數填入上次的坑j內,同時j向下更新
					A[j--] = A[i];
			}
			// 將key值填入中坑
			A[i] = key;
			part(l, i - 1, A);
			part(i + 1, r, A);
		}
	}

	/**
	 * 快速排序——單向搜索 由小到大
	 */
	private static void part_single_s2b(int l, int r, int[] A) {

		if (l < r) {
			int i = l - 1;
			int key = A[r];
			for (int j = l; j < r; j++) {
				if (A[j] > key) {
					i++;
					int tmp = A[i];
					A[i] = A[j];
					A[j] = tmp;
				}
			}
			A[r] = A[i + 1];
			A[i + 1] = key;
			part_single_s2b(l, i, A);
			part_single_s2b(i + 2, r, A);
		}

	}

關於快排序單掃描的解釋:圖摘自結構之法大神博客:http://blog.csdn.net/v_JULY_v/article/details/6262915

關於挖坑填數的雙向掃描:
參加此大神博客:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html html

Console: java

=======隨機數組100000個數據=======
=======耗時0.014毫秒=======
=======快速排序,雙向掃描快速排序,生成有序數列=======
=======耗時0.016毫秒=======
=======快速排序,單向掃描快速排序,由大到小=======
=======耗時0.232毫秒=======
=======快速排序,雙向掃描快速排序,由小到大=======
=======耗時0.005毫秒=======
=======冒泡排序,由小到大=======
=======耗時2.541毫秒=======
=======選擇排序,由小到大=======
=======耗時3.741毫秒=======
=======插入排序,由小到大=======
=======耗時0.004毫秒======= windows

相關文章
相關標籤/搜索