快排较为简单的实现,容易记忆
package com.wsb.test01;
public class Partition {
public static void swap(int[] array, int a, int b) {
int tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
public static void QuickSort(int[] array, int istart, int iend)
{
int left = istart;
int right = iend;
while(left != right)
{
// 把第一个数字 当做标杆
while(array[left] <= array[right] && left < right)// 当左边第一个 < 右边 right则从右往左走
right--;
swap(array, left, right);
while(array[left] <= array[right] && left < right)// 当左边第一个 < 右边 right则从右往左走
left++;
swap(array, left, right);
}
if (left > istart)
QuickSort(array,istart, left - 1);
if (left < iend)
QuickSort(array,left + 1, iend);
}
public static void main(String args[]){
int[] price = new int[] {2,4,1,8,9,10,4,7};
QuickSort(price, 0, price.length-1);
for(int i= 0;i<price.length;i++){
System.out.println(price[i]);
}
}
}
利用快排实现查找数组中第k大的数字
package com.wsb.test01;
public class Partition {
public static void swap(int[] array, int a, int b) {
int tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
public static int FindK(int[] array, int istart, int iend, int k)
{
int left = istart;
int right = iend;
while(left != right)
{
// 把第一个数字 当做标杆
while(array[left] >= array[right] && left < right)// 当左边第一个 < 右边 right则从右往左走
right--;
swap(array, left, right);
while(array[left] >= array[right] && left < right)// 当左边第一个 < 右边 right则从右往左走
left++;
swap(array, left, right);
}
if (left - istart + 1 == k)
return array[left];
else if (left - istart + 1 > k) {
return FindK(array,istart, left - 1, k);
}
else {
return FindK(array,left + 1, iend, k - (left - istart + 1));
}
}
public static void main(String args[]){
int[] price = new int[] { 23, 476, 65, 12, 3, 925, 8, 98, 76, 345, 90, 21, 762, 75, 34, 123, 61 };
int k = FindK(price, 0, price.length-1, 2);
System.out.println(k);
}
}