求N个数的数组中第K大的数的值
方法一:将这N个数的数组,通过简单的冒泡排序法,以递减的顺序将数组排序,然后返回第K个元素。
方法二:先把前K个元素拷贝到数组b,以递减的顺序对其排序,然后,将剩下的元素逐个与数组b比较,
如果小于数组b中的第K个元素则忽略,否则将新元素放到数组b中正确的位置上,同时将数组b中的一个
元素挤出数组。当算法终止时,返回数组b中第K个元素。
代码实现:
1 #define K 4 2 #define N 15 3 4 ... 5 6 //输入N个数 7 printf("N numbers:\n"); 8 int a[N]; 9 for (int i = 0; i < N; i++) 10 { 11 scanf("%d", a + i); 12 } 13 14 //取前k个元素 15 int b[K]; 16 for (int i = 0; i < K; i++) 17 { 18 b[i] = a[i]; 19 } 20 21 //前k个元素降序排序 22 for (int i = K; i > 0; i--) 23 { 24 for (int j = 0; j < i - 1; j++) 25 { 26 if (b[j] < b[j+1]) 27 { 28 int temp = b[j]; 29 b[j] = b[j + 1]; 30 b[j + 1] = temp; 31 } 32 } 33 }
将a剩下的元素逐个插入数组b正确的位置上:
方法1:
1 //将a剩下的元素与b中第K个元素比较,如果大于b中第K个元素,就将b中第K个元素赋值为a的元素,然后重新以降序排序数组b 2 for (int i = K; i < N; i++) 3 { 4 if (a[i] > b[K - 1]) 5 { 6 b[K - 1] = a[i]; 7 8 for (int j = K - 1; j > 0; --j) 9 { 10 if (b[j] > b[j - 1]) 11 { 12 int temp = b[j]; 13 b[j] = b[j - 1]; 14 b[j - 1] = temp; 15 } 16 } 17 } 18 }
方法2:
1 //将a剩下的元素与b中的从第1个到第K个元素逐个比较,遇到大于b中的元素时,将b中该元素之后的所有元素都赋值为其本身前一位的元素的值,然后该元素赋值为a的元素。 2 for (int i = K; i < N; i++) 3 { 4 for (int j = 0; j < K; j++) 5 { 6 if ( b[j] < a[i]) 7 { 8 for (int m = K - 1; m > j; m--) 9 { 10 b[m] = b[m - 1]; 11 } 12 13 b[j] = a[i]; 14 15 break; 16 } 17 } 18 }
输出数组a中第K大的数:
1 //输出b中第K个元素 2 printf("%d\n", b[K - 1]);