1. 程式人生 > >分治1——輸出前m個大的數

分治1——輸出前m個大的數

輸出n個數中前m個大的數可以採用先排序在取前m個大的數,這個最好的時間複雜度為O(nlogn)。可以利用快排的思想加快時間複雜度,下面演算法時間複雜度為O(n+mlogm),若m<<n時,則時間複雜度約為O(n)。
#include<iostream>

using namespace std;
int a[100];

void swap(int &a, int &b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}
void QuickSort(int a[], int s, int e, int m)
{
	if (s >= e)
		return;
	int k = a[s];
	int i = s, j = e;
	while (i != j)
	{
		if (j > i && a[j] > k)
			j--;
		swap(a[i], a[j]);
		if (j > i && a[i] < k)
			i++;
		swap(a[i], a[j]);
	}

	int b = (e - j) + 1; // 判斷右邊大的數有幾個
	if (m > b)           // 若小於m個,在左邊再取m-b個
		QuickSort(a, s, i, m - b);
	if (m < b)           // 若大於m個,在右邊再去m個
		QuickSort(a, j + 1, e, m);
}

int main()
{
	int m,n;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	QuickSort(a, 0, n - 1, m);
	for (int i = n-1; i >= n-m; i--)
		cout << a[i] << ' ';
	cout << endl;
	system("pause");
}

相關推薦

分治1——輸出m大的數

輸出n個數中前m個大的數可以採用先排序在取前m個大的數,這個最好的時間複雜度為O(nlogn)。可以利用快排的思想加快時間複雜度,下面演算法時間複雜度為O(n+mlogm),若m<<n時,則時間複雜度約為O(

一組資料取m大數及對應的索引

一組資料長度N,取前m個最大數及對應的索引 思路:分為3種情況:取前m個最大數;只取第m個最大數;取前m個最大數及索引 情況1:取前m個最大數 (1) 取這組資料的前m個數,sort從小到大排序 (2) 迴圈這組資料的第m+1 到第N 個數       比對這個資料在(1)

機試演算法講解: 第6題 給n整數,按從大到小的順序,輸出m大的整數

/* 問題:給n個整數,按從大到小的順序,輸出前m大的整數 0<m,n<1000000,每個整數[-500000,500000] 輸入: 5 3 3 -35 92 213 -644 輸出: 213 92 3 思路: 先按從小到大用快排排好序,然後輸出排好序的陣

【C語言程序】輸出50素數

img include clu log isp ++ c語言 while bsp #include <stdio.h>#include <stdlib.h> int main(void) { int x=2; int i,cnt=0; while(c

練習-輸出50素數

void prime stat 輸出 rim out new style pan public class Test { public static void main(String[] args) { int [] primes = new in

C++:將一個數組的m元素和後n-m元素整體互換位置

笨方法 >_<  #include <iostream> using namespace std; int main() { int n,m,i,j; int a[100]; cout<<"請輸入要建立陣列的長度(不能超過100)

分治輸出k大的數

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

Leetcode 264. Ugly Number II-輸出n醜數(從小到大)

Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. 

Java實現斐波那契數列並輸出10000數值

斐波納契數列,又稱黃金分割數列,指的是這樣一個數列:0、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&

快速排序問題(輸出m大的數)

今天做的第一道題就卡死我了,總是超時,總是出錯! 給你n個整數,請按從大到小的順序輸出其中前m大的數。 Input 每組測試資料有兩行,第一行有兩個數n,m(0<n,m<100

迴圈連結串列報數問題,n個人編號分別為1,2,3,……n,從第k編號開始數1,2到m然後刪除第m個人,然後下 一個人再從1開始數數到第m,然後再刪除m

#include<iostream> #include<stdio.h> using namespace std; //迴圈連結串列報數問題,n個人編號分別為1,2,3,……n,從第k個編號開始數1,2到m個然後刪除第m個人,然後下 //一個人再從1

【Python】【輸出m大的數】

問題: 給定一個數組包含n個元素,統計前m個大的數,並把這m大的數從大到小排列給出 輸入 第一行為一個整數,表述要輸出的前m個數 第二行為n個整數,給出需要排序的陣列 輸出 從大到小的m大的數 例子 綠色的是輸入白色的是輸出 思想: 先找m個大的放在陣列右

Unity中使用C#遞迴輸出陣列1,2,3,5,8,...該陣列的生成規律是每一個數字是數字的和

一、實現思路:第一個數大於等於0,第二個數大於等於第一個數,最後指定一個需要輸出的最後一個數字(該數字用作最後輸出的界限) ①實現指令碼如下: /*** * Title:"XXX" 專案 * 主題:XXX * Description: * 功能:XXX * Date:2018 * Ver

輸入若干整數,以-1標記輸入結束。輸出其中的最大數

import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] a=new int[100]; int m

典型的Top K演算法 _找出一個數組裡面前K大數_找出1浮點數中最大的10000_一個文字檔案,找出10經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法一次讀入記憶體.

        搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。         假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢

輸入m個學生,每個學生有4門課,在主調函式中輸入學生的相關資訊,編寫三函式: (1)求第一門課的平均分; (2)找出有兩門課以上不及格的學生,並輸出他們的學號和全部成績,要求用指標函式實現:fl

  輸入m個學生,每個學生有4門課,在主調函式中輸入學生的相關資訊,編寫三個函式: (1)求第一門課的平均分; (2)找出有兩門課以上不及格的學生,並輸出他們的學號和全部成績,要求用指標函式實現:float*Search(float(*p)[4],int n); (3)找出

C語言輸出素數表(1-100)&100

本來是想第二篇做雙鏈表的,今天看C和指標第四章,複習了以下之前做的素數輸出,三種不同方法,結果如下: 1.輸出1-100以內的素數: //這個比較簡單,不多做介紹,唯一注意的一點是for迴圈截止條件

從0到n-1中隨機等概率輸出m不重複的數

題目描述 假設n遠大於m,程式設計實現從0到n-1中隨機等概率的輸出m個不重複的數。 void knuth(int n,int m) { srand((unsigned int)time(0

hdu 3183 A Magic Lamp(給一個n位的數,從中刪去m數字,使得剩下的數字組成的數最小(順序不能變),然後輸出

urn scan eight sca query names efi family 題目 1.題目大意是,給你一個1000位的數,要你刪掉m個為,求結果最小數。 思路:在n個位裏面刪除m個位。也就是找出n-m個位組成最小數 所以在區間 [0, m]裏面找