方法一:將這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]);