排序演算法刷題

2021-09-25 14:45:55 字數 4819 閱讀 9616

演算法分析:計數排序

複雜度:θ(k+n)

題目

題目描述

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了 nnn 個 111 到 100010001000 之間的隨機整數(n≤100n≤100n≤100),對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成「去重」與「排序」的工作

**輸入描述 **

有 2 行,第 1 行為 1 個正整數 nnn,表示所生成的隨機數的個數:

第 2行有 n個用空格隔開的正整數,為所產生的隨機數。

輸出描述

有2行,第 1 行為 1 個正整數 m,表示不相同的隨機數的個數。第 2 行為 mmm 個用空格隔開的正整數,為從小到大排好序的不相同的隨機數。

解答(c++)

//明明的隨機數

#include

using

namespace std;

intmain()

}cout

0;i<

1000

;i++)if

(x[i]==1

) cout<1<<

' ';

return0;

}

分析:快速排序

題目

題目描述

某小學最近得到了一筆贊助,打算拿出其中一部分為學習成績優秀的前 555 名學生發獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學 排在前面,這樣,每個學生的排序是唯一確定的。任務:先根據輸入的 3 門課的成績計算總分,然後按上述規則排序,最後按排名順序輸出前五名名學生的學號和總分。注意,在前 5 名同學中,每個人的獎學金都不相同,因此,你必須嚴格按上述規則排序。例如,在某個正確答案中,如果前兩行的輸出資料(每行輸出兩個數:學號、總分) 是:

7 279

5 279

這兩行資料的含義是:總分最高的兩個同學的學號依次是 7 號、5 號。這兩名同學的總分都是 279(總分等於輸入的語文、數學、英語三科成績之和),但學號為 7 的學生語文成績更高一些。如果你的前兩名的輸出資料是:

5 279

7 279

則按輸出錯誤處理,不能得分。

輸入描述

第 1 行為乙個正整數 n,表示該校參加評選的學生人數。第 2 到 n+1 行,每行有 3個用空格隔開的數字,每個數字都在 0 到 100 之間。第 j 行的 3個數字依次表示學號為 j-1 的學生的語文、數學、英語的成績。每個學生的學號按照輸入順序編號為 1 ~ n (恰好是輸入資料的行號減 1)。所給的資料都是正確的,不必檢驗。

輸出描述

共有 5 行,每行是兩個用空格隔開的正整數,依次表示前 5 名學生的學號和總分。

解答(c++)

//獎學金

#include

using

namespace std;

struct score

;//存學生資訊

intpartition

(score *x,

int l,

int r)

//確定乙個元素的特定位置

}score t=x[

++ret]

;x[ret]

=x[r]

;x[r]

=t;return ret;

}void

quick_sort

(score *x,

int l,

int r)

//快速排序

}int

main()

//輸入

quick_sort

(x,0

,n-1);

//快速排序

for(i=

0;i<

5;i++

)//輸出

cout<.id<<

' '<.sum

}`

分析:排序、貪心演算法

題目

題目描述

元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據**進行分組,但每組最多只能包括兩件紀念品, 並且每組紀念品的**之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。

輸入描述

第 1 行包括乙個整數 w,為每組紀念品**之和的上眼第 2 行為乙個整數 n,表示購來的紀念品的總件數第 3 ~ n+2 行每行包含乙個正整數 pi(5≤pi≤w) 表示所對應紀念品的**。

輸出描述

僅一行,包含乙個整數, 即最少的分組數目。

解答(c++)

//紀念品分組

#include

using

namespace std;

intpartition

(int

*x,int l,

int r)

int t=x[

++ret]

; x[ret]

=x[r]

; x[r]

=t;return ret;

}void

quick_sort

(int

*x,int l,

int r)

}int

find_max_group

(int

*x,int n,

int max)

else

j--;}

return n-ret;

}int

main()

分析:排序(為裝逼採用堆排序)、揹包演算法

題目

題目描述

牛奶包裝是乙個如此低利潤的生意,以至於盡可能低地控制初級產品(牛奶)的**變得十分重要。請幫助merry的牛奶製造公司(merry milk makers』)以盡可能最廉價的方式取得他們所需的牛奶。merry的牛奶製造公司從一些農民那購買牛奶,每個農民賣給牛奶製造公司的**不一定相同。而且,如乙隻母牛一天只能生產一定量的牛奶,農民每一天只有一定量的牛奶可以賣。每天,merry 的牛奶製造公司從每個農民那購買一定量的牛奶,少於或等於農民所能提供的最大值。給出 merry 牛奶製造公司的每日的牛奶需求,連同每個農民的可提供的牛奶量和每加侖的**,請計算 merry 的牛奶製造公司所要付出錢的最小值。注意:每天農民生產的牛奶的總數對 merry 的牛奶製造公司來說是足夠的。

輸入描述

第 1 行共二個數值:n,(0≤n≤2,000,000) 是需要牛奶的總數;m,(0≤m≤5,000) 是提供牛奶的農民個數。第 2 到 m+1 行:每行二個整數:pi​ 和 ai​。pi(0≤pi≤1,000) 是農民 i 的牛奶的**。ai(0≤ai≤2,000,000) 是農民 i 一天能賣給 marry 的牛奶製造公司的牛奶數量。

輸出描述

單獨的一行包含單獨的乙個整數,表示 marry 的牛奶製造公司拿到所需的牛奶所要的最小費用。

原始碼(c++)

#include

using

namespace std;

struct milk

;void

exchange

(milk &x,milk &y)

void

max_heap

(milk *x,

int i,

int n)

}void

build_max_heap

(milk *x,

int n)

void

heap_sort

(milk *x,

int n)

}int

main()

if(provide<=demand)

cout

return0;

}

分析:找準迴圈不變數

題目

題目描述

設有 n 個正整數(n≤20),將它們聯接成一排,組成乙個最大的多位整數。

例如:n=3 時,3 個整數 13,312,343 聯接成的最大整數為:34331213

又如:n=4 時,4 個整數 7,13,4,246 聯接成的最大整數為:7424613

輸入描述

n個數輸出描述

聯接成的多位數

原始碼(c++)

#include

using

namespace std;

intcompare_int

(int x,

int y)

void

bubble_sort

(int

*x,int n)

}int

main()

C LeetCode刷題 排序

排序篇 題名刷題通過率難度 56合併區間 31.2 中等57 插入區間 30.4 困難75 顏色分類 48.6 中等147 對鍊錶進行插入排序 50.7 中等148 排序鍊錶 52.7 中等164 最大間距 43.0 困難179 最大數 26.7 中等242 有效的字母異位詞 c leetcode刷...

刷題模板 排序

public void quicksort int input,int p,int q public int partition int input,int p,int q swap input,i,j 必須 input p input i input i temp 必須 return i 參考 用...

刷題筆記 排序

1.確定分界點 mid l r 2 2.遞迴排序left right部分 3.使用雙指標演算法歸併排序left right部分 1.總的數量等於 left邊中逆序對的數量 right邊中逆序對的數量 left right兩邊的元素共同組成的逆序對的數量 2.如何求算left right兩邊的元素共同...