计算机算法设计与分析(算法实现题4)
4-2 最优合并问题
问题描述: 给定k个排好序的序列s1,s2,s3,…,sk,用2路合并算法将这k个序列合并成一个序列。假设采用的2路合并算法合并2个长度分别为 m 和 n 的序列需要m+n-1次比较。试设定一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并序列,使所需的总比较次数最多。 算法设计: 对于给定的k个待合序列,计算最多比较次数和最少比较次数合并方案。
具体代码实现:分为一个主方法,一个随机数产生方法,两个排序方法,两个合并序列方法
import java. util. Random;
import java. util. Scanner;
public class Realize4_2 {
public static void main ( String[ ] args) {
Integer[ ] produceNum = produceNum ( ) ;
Integer[ ] sortMaxToMinArr = sortMaxToMinArr ( produceNum) ;
designFormulasMax ( sortMaxToMinArr) ;
Integer[ ] sortMinToMaxArr = sortMinToMaxArr ( produceNum) ;
designFormulasMin ( sortMinToMaxArr) ;
}
public static Integer[ ] produceNum ( ) {
System. out. println ( "请输入需要合并序列的个数 k:" ) ;
Scanner scanner = new Scanner ( System. in) ;
Integer num = Integer. valueOf ( scanner. next ( ) ) ;
Integer[ ] arr = new Integer [ num] ;
for ( int i = 0 ; i < num; i++ ) {
Random random = new Random ( ) ;
if ( random. nextInt ( 101 ) != 0 ) {
arr[ i] = random. nextInt ( 101 ) ;
System. out. print ( arr[ i] + " " ) ;
} else {
i-- ;
}
}
System. out. println ( ) ;
return arr;
}
public static Integer[ ] sortMaxToMinArr ( Integer[ ] arr) {
for ( int i = 0 ; i < arr. length; i++ ) {
for ( int j = i+ 1 ; j < arr. length; j++ ) {
if ( arr[ j] > arr[ i] ) {
Integer temp;
temp = arr[ j] ;
arr[ j] = arr[ i] ;
arr[ i] = temp;
}
}
}
return arr;
}
public static Integer[ ] sortMinToMaxArr ( Integer[ ] arr) {
for ( int i = 0 ; i < arr. length; i++ ) {
for ( int j = i+ 1 ; j < arr. length; j++ ) {
if ( arr[ j] < arr[ i] ) {
Integer temp;
temp = arr[ j] ;
arr[ j] = arr[ i] ;
arr[ i] = temp;
}
}
}
return arr;
}
public static void designFormulasMax ( Integer[ ] arr) {
Integer[ ] sumArr = new Integer [ arr. length- 1 ] ;
Integer sum = arr[ 0 ] ;
for ( int i = 1 ; i < arr. length; i++ ) {
sum = sum+ arr[ i] - 1 ;
sumArr[ i- 1 ] = sum;
}
int sums= 0 ;
for ( int i = 0 ; i < sumArr. length; i++ ) {
sums = sums+ sumArr[ i] ;
}
System. out. println ( "最多比较的次数为:" + sums) ;
}
public static void designFormulasMin ( Integer[ ] arr) {
Integer[ ] sumArr = new Integer [ arr. length- 1 ] ;
Integer sum;
Integer n= 1 ;
for ( int i = 1 ; i < arr. length; i++ ) {
sum = arr[ i] + arr[ i- 1 ] - 1 ;
sumArr[ n- 1 ] = sum;
Integer[ ] tempArr = new Integer [ arr. length- n] ;
tempArr[ 0 ] = sum;
for ( int j = 1 ; j < tempArr. length; j++ ) {
tempArr[ j] = arr[ j+ 1 ] ;
}
Integer[ ] toMinArr = sortMinToMaxArr ( tempArr) ;
for ( int j = 0 ; j < arr. length; j++ ) {
arr[ j] = 0 ;
}
for ( int j = 0 ; j < toMinArr. length; j++ ) {
arr[ j] = toMinArr[ j] ;
}
i= 0 ;
n++ ;
if ( arr. length- n == 0 ) {
break ;
}
}
int sums = 0 ;
for ( int i = 0 ; i < sumArr. length; i++ ) {
sums = sums + sumArr[ i] ;
}
System. out. println ( "最少比较的次数为:" + sums) ;
}
}
运行结果