算法學習——單鏈錶快排

/**
	 * 以p爲軸對start-end間的節點進行快排(包括start && 不包括end);
	 * 思路:
	 * 1.將頭節點做爲軸節點start,從start.next開始遍歷,若是節點小於軸start的值,將該節點插入到軸節點後面;
	 * 2.將軸節點插入合適位置,即找到最後一個小於軸的節點,將該節點與軸節點值互換,此時就鏈表分爲兩部分,小於軸節點和大於軸節點;
	 * 3.遞歸的遍歷2中兩部分節點。
	 * 
	 * @param p
	 * @param start
	 * @param end
	 */
	private static void quickSortWithLinkedList(Node start, Node end) {

		if (start == null || start == end) {
			return;
		}
		Node last = start;
		Node cur = start.next;
		
		Node next ;

		// 1.默認start做爲軸,若是index比start小則移動到start的next
		while (cur != null && cur != end) {
			next = cur.next;
			if (cur.value <= start.value) {
				if (start != last) {//爲了防止第一個元素小於軸時發生的重複引用
					last.next = next;
					Node startNext = start.next;
					start.next = cur;
					cur.next = startNext;
					cur = next;
				}else{
					last = cur;
					cur = cur.next;
				}
			} else {
				last = cur;
				cur = cur.next;
			}
		}
		// 2.將軸移動到合適的位置,與小於軸的節點的值互換
		Node newIndex = start.next;
		last = start;
		// 找到軸插入的位置last,即找到最後一個小於軸的節點;newIndex != end是爲了防止將end加入到計算範圍中
		while (newIndex != null && newIndex != end && newIndex.value <= start.value) {
			last = newIndex;
			newIndex = newIndex.next;
		}
		//
		// 將軸與插入位置上節點的值進行交換
		int temp = last.value;
		last.value = start.value;
		start.value = temp;
		// 3.進行下一次迭代
		quickSortWithLinkedList(start, last);
		quickSortWithLinkedList(last.next, end);
	}
相關文章
相關標籤/搜索