描述
給定乙個陣列包含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這個地方要注意一下,arrangeright這個函式做的只是把所有前m大的數放在右邊。一旦總數量到達了m就會return。只要資料規模足夠大的話後面的速度就會比前面快很多。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;
}
**參考:(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個大的排在右邊的思想是對整個陣列進行一次快速排序,看返回的中間位置到陣列最後的大小...