複雜度nlog n 之快速排序

2021-07-15 08:14:01 字數 1039 閱讀 5216

快速排序是利用分治和遞迴的思想進行的排序演算法,每一次都將第乙個元素置於它在陣列中應該的位置(前面的數字比它小,後面的數字比它大),然後就把此數的前半段和後半段重複前面的操作。核心思想就是利用了乙個paration這個函式。

平均時間複雜度

最好時間複雜度

最壞時間複雜度

空間複雜度

nlog(n)

nlog(n)

n2log(n)

/**

* 快速排序的核心演算法

* * @param array

* @param start

* @param end

* @return

*/public static int paration(int array, int start, int

end)

array[start] = array[end];

while (array[start] <= temp && start

< end)

array[end] = array[start];

}array[start] = temp;

return start;

}

我們來簡單分析一下這個**,這段**就是找出第乙個array[start]在array陣列中的位置index,並且將所有小於array[start]的數交換到index前面去,將所有比array[start]大的數交換到index後面去,這就是快排的乙個小分支。

/**

* 快速排序

* 時間複雜度為nlog(n)

* * 最好的時間複雜度為nlog(n)

* 最壞的時間複雜度為n*n

* * @param array

*/public static void quicksort(int array, int start, int

end)

}

利用遞迴不停地分割,一直到start和end相同時,就是陣列被分成乙個乙個數的時候,這樣這個資料就變成有序的了。

複雜度nlog n 之堆排序

堆排序是利用特殊二叉樹大頂堆和小頂堆進行排序的演算法,通過將陣列轉化成大頂堆 滿足array n array 2n 1 和array n array 2n 2 這兩個條件 然後將array 0 和array array.length 1 交換,然後將無序區重新構建大頂堆。重複之前的步驟知道所有的都變...

快速排序的時間複雜度與空間複雜度

我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...

插入排序複雜度為什麼不是nlog n

插入排序是一種很基本的排序,其複雜度為o n2 在大一學程式設計時沒有多想,為什麼不能利用二分查詢改進為o nlogn 呢 我們都知道插入排序就是在已有的序列上不斷地插入新的元素,我們都知道二分查詢的時間複雜度是o logn 二分查詢的條件就是序列必須是有序的。而剛好可以用在插入排序的過程中使用,這...