基礎演算法 排序 複雜排序之二(找出第K大的數)

2021-06-26 16:09:26 字數 1151 閱讀 4818

分割的思想是快速排序最精髓的地方。每一次分割出來的元素k乙個排在第k位,所以利用這種思想我們至少知道3點

1. 被分割出來的元素k最後一定排在第k位。

2. 在k左邊的元素一定比k小或者相等。

3. 在k右邊的元素一定比k大或者相等。

所以我們可以通過這些性質定位到任意乙個元素。

比如我們partition完乙個陣列後,得到a=

a[k]=8,所以我們知道排好序後的a[5]=8, a[4]一定在8左邊,a[6]一定在8右邊

所以,我們一定知道8這個數是陣列裡第5+1小的數,第10-5大的數

所以我們得出 如果分割出來的數a[k]=x, 那麼x一定是陣列裡的第k+1位,也就是第k+1小的數

如果陣列的長度為n,那麼x就是陣列裡第n-k大的數

下面是分割的**

public static int partition(int array, int left, int right) 

exchange(array, left, j);

return j;

}

接下來就是如何在分割後定位其他的元素了?

如果我們定位了a[k]=x,發現目標元素o比x大,那麼就在右邊找,left=k+1,如果比x小,那麼就在左邊找,right=k-1,否則定位成功

public static int select(int array, int k) 

return array[k];

}

// compare

public static boolean more(int v, int w)

// exchange

public static void exchange(int array, int i, int j)

public static int partition(int array, int left, int right)

exchange(array, left, j);

return j;

} public static int select(int array, int k)

return array[k];

}

基礎演算法 排序 簡單排序之二(選擇排序)

選擇排序的時間複雜度依然為o n 2 一,原始選擇排序 最簡單最好記的 也是最糟糕的排序,稱之為暴力排序,時間複雜度為o n 2 直接上 吧,除非在面試的時候所有的排序演算法都想不起來了,不然不要選擇這個排序 compare public static boolean more int v,int ...

排序演算法之二 氣泡排序

氣泡排序 bubble sort 的演算法原理如下 從第乙個元素開始,每兩個元素進行比較,將較大的元素放在後面 比較之後,進行下一對比較 一直到最後乙個元素,這樣得到的最後乙個元素就是整個陣列裡面的最大值,這個過程就稱之為冒泡。以這種方式對剩餘的元素進行冒泡,最後就得到了排好序的陣列序列。氣泡排序法...

java 演算法基礎之二快速排序演算法

所謂的快速排序的思想就是,首先把陣列的第乙個數拿出來做為乙個key,在前後分別設定乙個i,j做為標識,然後拿這個key對這個陣列從後面往前遍歷,及j 直到找到第乙個小於這個key的那個數,然後交換這兩個值,交換完成後,我們拿著這個key要從i往後遍歷了,及i 一直迴圈到i j結束,當這裡結束後,我們...