题目如下:
给出一个分治算法来找出n个元素序列中第二大的元素。
我选择的分治算法是快速排序算法。
数组通过随机数来产生。
代码实现如下:
package 实验测试;
import java.util.Scanner;
public class SIX {
public static void main(String args[]) {
int n;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
int arr[] = new int [n];
int low = 0;
int high = arr.length-1;
for(int i = 0; i < n; i++) {
arr[i] = (int)(Math.random()*10000);
}
KP a = new KP();
a.quicksort(arr, low, high);
System.out.print("排序好的序列为:");
for(int w = 0; w < arr.length; w++) {
System.out.print(arr[w]+" ");
}
System.out.println();
for(int q = arr.length - 1; q >= 0; q--) {
if(arr[q] != arr[q-1]) {
System.out.print("第二大的元素为:"+arr[q-1]);
}
break;
}
}
}
class KP{
void quicksort(int arr[], int low, int high) {
if( low > high) {
return;
}
//2, 存
int i = low;
int j = high;
//3,key
int key = arr[low];
//4,完成一趟排序
while( i< j) {
//4.1 ,从右往左找到第一个小于key的数
while(i<j && arr[j] > key){
j--;
}
// 4.2 从左往右找到第一个大于key的数
while( i<j && arr[i] <= key) {
i++;
}
//4.3 交换
if(i<j) {
int p = arr[i];
arr[i] = arr[j];
arr[j] = p;
}
}
// 4.4,调整key的位置
int p = arr[i];
arr[i] = arr[low];
arr[low] = p;
//5, 对key左边的数快排
quicksort(arr, low, i-1 );
//6, 对key右边的数快排
quicksort(arr, i+1, high);
}
}
运行截图如下: