輸出前m的的數

2022-09-20 08:36:09 字數 2286 閱讀 1289

描述

給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小輸出。

輸入第一行包含乙個整數n,表示陣列的大小。n < 100000。 第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。 第三行包含乙個整數m。m < n。

輸出從大到小輸出前m大的數,每個數一行。

方法1:對全體的數字進行歸併排序,輸出前m大的數(o(nlogn))**:

#include using

namespace

std;

int a[1000000],temp[1000000

];void merge(int *a,int s,int e,int m,int *tmp)

else

}while(p1<=m)

while(p2<=e)

for(int i = 0;i1;i++)

}void mergesort(int *a,int s,int e,int *tmp)

}int

main()

mergesort(a,

0,n-1

,temp);

for(int i = n-m;i)

else

}cout

<

}return0;

}

方法二:

用分治處理:複雜度 o(n+mlogm)

思路:把前m大的都弄到陣列最右邊,然後對這最右邊m個元素排序,再輸出

關鍵 :o(n)時間內實現把前m大的都弄到陣列最右邊

引入操作 arrangeright(k): 把陣列(或陣列的一部分)前k大的都弄到最右邊

如何將前k大的都弄到最右邊

1)設key=a[0], 將key挪到適當位置,使得比key小的元素都在key左邊,比key大的元素都在key右邊(線性時間完成)——也就是使用一次快速排序的過程

2) 選擇陣列的前部或後部再進行 arrangeright操作

a = k done 表示完成此過程

a > k 對此a個元素再進行arrangerigth(k)

a < k 對左邊b個元素再進行arrangeright(k-a)

(這個地方引入影象加深思考)

有a個數是比key大的,b個是比key更小的,現在開始比較前k個數在這個陣列裡面的分布,有三種情況,第一種情況就是k==a這個就是說明剛好前a個大剛好滿足題目的要求,如果a>k說明只要對右邊再次找arrangeright(k),如果是a

#include using

namespace

std;

int a[1000000],temp[1000000

];void merge(int *a,int s,int e,int m,int *tmp)

else

}while(p1<=m)

while(p2<=e)

for(int i = 0;i1;i++)

}void mergesort(int *a,int s,int e,int *tmp)

}void arrangeright(int *a,int s,int e,int

k)

int t =a[s];

int i =s,j =e;

while(i !=j)

swap(a[i],a[j]);

while(i=a[i])

swap(a[i],a[j]);

}//這個i結束是在中間

int num = e-i+1

;

if(num ==k)

if(num>k)

if(num

}int

main()

arrangeright(a,

0,n-1

,m);

mergesort(a,n-m,n-1

,temp);

for(int i = n-m;i)

else

}cout

<

}return0;

}

這個地方要注意一下,arrangeright這個函式做的只是把所有前m大的數放在右邊。一旦總數量到達了m就會return。只要資料規模足夠大的話後面的速度就會比前面快很多。

**參考:(92條訊息) 輸出前m大的數_jamence的部落格-csdn部落格

輸出前m大的數

o n mlogm n為快排中線性掃瞄時間,mlogm為對m各最大數進行歸併排序耗時 includeusing namespace std int a 100 void swap int a,int b void merge int a,int s,int m,int e,int tmp 歸併 把每...

輸出前m大的數

描述 給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小 輸出。輸入 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開 每個整數的絕對值不超過100000000。第三行包含乙個整數m。m n。輸出從大到小輸出前m大的數,每...

Python 輸出前m大的數

給定乙個陣列包含n個元素,統計前m個大的數,並把這m大的數從大到小排列給出 第一行為乙個整數,表述要輸出的前m個數 第二行為n個整數,給出需要排序的陣列 從大到小的m大的數 先找m個大的放在陣列右邊然後再進行排序。找m個大的排在右邊的思想是對整個陣列進行一次快速排序,看返回的中間位置到陣列最後的大小...