排序練習

題目描述:
給你n個整數,請按從大到小的順序輸出其中前m大的數。
輸入:
每組測試數據有兩行,第一行有兩個數n,m(0<n,m<1000000),第二行包含n個各不相同,且都處于區間[-500000,500000]的整數。

輸出:
對每組測試數據按從大到小的順序輸出前m大的數。
樣例輸入:
5 33 -35 92 213 -644

樣例輸出:
213 92 3

解法1


解法一
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1000000
using namespace std;
int a[N];
int main()
{
    int n, m, i, flag = 0;
    while (scanf_s("%d%d", &n, &m) != EOF) {
        for (i = 0;i<n;i++)
            scanf_s("%d", &a[i]);
        sort(a, a + n);
        flag = n - 1;
        printf("%d", a[flag]);
        flag -= 1;
        for (i = m;i>1;i--) {
            printf(" %d", a[flag]);
            flag--;
        }
        cout << endl;
    }
    return 0;
}

解法2


解法二
#include <stdio.h>
#define OFFSET 500000 //偏移量,用于補償實際數字與數組下標之間偏移
int Hash[1000001]; //偏移量,用于補償實際數字與數組下標之間偏移
int main() {
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        for (int i = -500000;i <= 500000;i++) {
            Hash[i + OFFSET] = 0;
        }//初始化,將每個數字都標記為未出現
        for (int i = 1;i <= n;i++) {
            int x;
            scanf("%d", &x);
            Hash[x + OFFSET] = 1; //凡是出現過的數字,該數組元素均被設置成1
        }
        for (int i = 500000;i >= -500000;i--) {  //輸出前m個數 
            if (Hash[i + OFFSET] == 1) { //若該數字在輸入中出現 
                printf("%d", i); //輸出該數字
                m--; //輸出一個數字后,m減一,直至m變為0 
                if (m != 0) printf(" "); //注意格式,若m個數未被輸出完畢,在輸出的 數字后緊跟一個空格
                else {
                    printf("\n"); //若m個數字已經被輸出完畢,則在輸出的數字后面緊跟 一個換行, 并跳出遍歷循環
                        break;
                }
            }
        }
    }
    return 0;
}

解法3


解法三
#include<stdio.h>
#define N 1000000
int array[N];

void quick_sort(int s[], int l, int r)
{
    int i, j, x;
    if (l < r)
    {
        i = l;
        j = r;
        x = s[i];
        while (i < j)
        {
            while (i < j && s[j] > x)
                j--; /* 從右向左找第一個小于x的數 */
            if (i < j)
                s[i++] = s[j];


            while (i < j && s[i] < x)
                i++; /* 從左向右找第一個大于x的數 */
            if (i < j)
                s[j--] = s[i];

        }
        s[i] = x;
        quick_sort(s, l, i - 1); /* 遞歸調用 */
        quick_sort(s, i + 1, r);
    }
}

int main() {
    int n, m;
    while (scanf_s("%d%d", &n, &m) != EOF) {
        for (int i = 0;i < n;i++) {
            scanf_s("%d", &array[i]);

        }
        quick_sort(array, 0, n - 1);
        int temp = m;
        for (int j = n - 1;j >= n-temp;j--) {
            printf_s("%d", array[j]);
            m--;        
            if (m != 0)
            printf(" ");
            else {
            printf("\n");
            break;
        }       
        }


    }
    return 0;
}

總結:解法三是我自己寫的,一次快速排序+反向的for循環。


過程中遇到的錯誤

輸出格式不正確。
解決辦法:每次輸出數字后m-1,m等于0的時候跳出循環即可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 題目描述:讀入N名學生的成績,將獲得某一給定分數的學生人數輸出。 輸入:測試輸入包含若干測試用例,每個測試用例的格...
    我是阿喵醬閱讀 783評論 0 5
  • 標簽(空格分隔): 算法 C++ 筆試 第三題:描述小王最近在開發一種新的游戲引擎,但是最近遇到了性能瓶頸。于是他...
    認真學計算機閱讀 1,928評論 0 8
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,766評論 0 33
  • 一.數組的基本概念 數組可以看成是多個相同類型數據組合,對這些數據的統一管理。 數組變量屬引用類型,數組也可以看成...
    崔璐也閱讀 1,012評論 0 0
  • 中午,同事和我說了她閨蜜的不幸遭遇: 她閨蜜長相普通,工作普通,家境一般,一家人在小城市里也過得平安自在。但在小城...
    孫艶閱讀 222評論 0 2