分割的思想是快速排序最精髓的地方。每一次分割出來的元素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結束,當這裡結束後,我們...