1.1 有一组N个数,求其第K大者。
方法1:bubble sort
#include <stdio.h>
int main(){
int arr[] = {10, 9, 8, 7, 1, 6, 2, 3, 4, 5};
int k; // 第K大
int i, j, arrLong;
printf("input the number> ");
scanf("%d", &k);
// bubble sort
arrLong = sizeof arr / sizeof arr[0];
for ( i = 1; i < arrLong; i++ ){
for ( j = 0; j < arrLong - 1; j++ ){
if ( arr[j+1] > arr[j] ){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
for ( i = 0; i < arrLong; i++ ){
printf("%4d", arr[i]);
}
printf("\n");
printf("第%d大:%d\n", k, arr[k-1]);
return 0;
}
方法2:先把前K个元素读入数组并(以递减顺序)对其排序。接着,将剩下的元素再逐个读入。
#include <stdio.h>
int main(){
int arr[] = {10, 9, 8, 7, 1, 6, 2, 3, 4, 5};
int k = 5; // 第K大
int arr2[5];
int i, j, arrLong, cnt;
arrLong = sizeof arr / sizeof arr[0];
for ( i = 0; i < k; i++ ){
arr2[i] = arr[i];
}
for ( i = 1; i < k; i++ ){
for ( j = 0; j < k - 1; j++ ){
if ( arr2[j+1] > arr2[j] ){
int temp = arr2[j+1];
arr2[j+1] = arr2[j];
arr2[j] = temp;
}
}
}
for ( i = k; i < arrLong; i++ ){
for ( j = 0; j < k; j++ ){
if ( arr[i] > arr2[j] ){
if ( j >= k - 1 ){
// insert at the end
arr2[k-1] = arr[i];
}else{
// move backword
for ( cnt = k - 1; cnt >= j; cnt-- ){
arr2[cnt] = arr2[cnt-1];
}
arr2[j] = arr[i];
}
}
}
}
for ( i = 0; i < k; i++ ){
printf("%4d", arr2[i]);
}
printf("\n");
printf("%d\n", arr2[k-1]);
return 0;
}