算法一
将这组数存入数组,用冒泡排序(或者其他排序方法)将这组数以递减 顺序进行排序,然后返回位于第 k – 1 位置的数,假如这组数中共有 10 个数的话:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <stdio.h> #define MAX_SIZE 10 int main () { int mar[MAX_SIZE]; printf ("输入这 10 个数:n" ); for (int i = 0 ; i < MAX_SIZE; ++i) scanf ("%d" , &mar[i]); int temp = 0 ; for (int m = 0 ; m < MAX_SIZE - 1 ; ++m) for (int n = m + 1 ; n < MAX_SIZE; ++n) if (mar[m] < mar[n]) { temp = mar[m]; mar[m] = mar[n]; mar[n] = temp; } int k = 0 ; printf ("输出这组数中的第几大数: " ); scanf ("%d" , &k); printf ("第 %d 大数为: %dn" , k, mar[k-1 ]); return 0 ; }
在以上程序中,输入的 10 个数为:22 13 25 32 11 68 72 33 42 90,要求输出这组数中的第 5 大数,则最后结果为
第 5 大数为: 33
与期望中一致。
算法二
将一组数中的 前 k 个数存入数组 ,以 递减 顺序将前 k 个数进行排序(冒泡排序或者其他排序方法),然后将余下的数逐个读入数组,如果读入的数小于数组中排序后的第 k 个数则忽略,否则将读入的数存入数组中的正确位置并从数组中挤出一个数,直到将这组数中的所有数都过一遍,结束算法,返回数组中位置 k – 1 的数,即为这组数中的第 k 大数,同样假设这组数中共有 10 个数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include <stdio.h> #define MAX_SIZE 10 int main () { int mar[MAX_SIZE]; unsigned k = 0 ; printf ("需要输出这组数中的第几大数: " ); scanf ("%d" , &k); printf ("输入这组数中的前 %d 个数: " , k); for (unsigned i = 0 ; i < k; ++i) scanf ("%d" , &mar[i]); int temp = 0 ; for (unsigned m = 0 ; m < k - 1 ; ++m) for (unsigned n = m + 1 ; n < k; ++n) if (mar[m] < mar[n]) { temp = mar[m]; mar[m] = mar[n]; mar[n] = temp; } int tmp = 0 ; int cnt = 0 ; printf ("逐个读入这组数中余下的数:n" ); for (unsigned j = 0 ; j < MAX_SIZE - k; ++j) { scanf ("%d" , &tmp); cnt = k - 1 ; if (tmp > mar[cnt]) { while (cnt >= 0 && tmp > mar[cnt]) --cnt; if (cnt >= 0 ) { for (int p = k - 2 ; p > cnt; --p) mar[p+1 ] = mar[p]; mar[cnt+1 ] = tmp; } else { for (int p = k - 2 ; p >= 0 ; --p) mar[p+1 ] = mar[p]; mar[0 ] = tmp; } } } printf ("这组数中的第 %d 大数为: %dn" , k, mar[k-1 ]); return 0 ; }
在以上程序中,对于:22 13 25 32 11 68 72 33 42 90 这 10 个数,要求输出这组数中的第 5 大数,则最后结果为
这组数中的第 5 大数为: 33
正确,与期望中一致。