来源:https://www.nowcoder.com/profile/448404/codeBookDetail?submissionId=1505827
基本思想
基本思想与上一篇相同、分划函数相同,主函数也是分治思想,不过没有随机取主元。
代码:
1 | public class SelectTest2 { |
// 分划函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public static int Partition(int[] l, int left, int right){
//前置条件:left<=right
int i=left, j=right+1; //哨兵位(防止越界)
do{
do i++; while(l[i]<l[left]&&i<right); //从首端向后找到>=l[left]的元素l[i]则停止;或i=right时停止
do j--; while(l[j]>l[left]); //从末端向前找到<=l[left]的元素l[j]则停止;或当j=left时l[j]=l[left]自动停止
if(i<j) Swap(l, i, j); //若大元素在小元素的前面则调换二者位置
}while(i<j); //若未越界则继续查找和调换
Swap(l, left, j); //调换l[left]和l[j]
return j;
}
/** 调换两个元素的位置 **/
public static void Swap(int[] l, int i, int j) {
int temp = l[i];
l[i] = l[j];
l[j] = temp;
}
// 测试1
2
3
4
5
6
7
8 public static void main(String[] args){
int[] input = {4,5,1,6,2,7,3,8};
SelectTest2 s = new SelectTest2();
int[] res = s.GetLeastNumbers_Solution(input,6);
System.out.println(Arrays.toString(input));
System.out.println(Arrays.toString(res));
}
}