演算法與資料結構實驗題 5.12 bubble sort
★實驗任務 給定乙個 1~n 的排列p ,即1到n中的每個數在p中都出現一次。
現在要對排列p進行氣泡排序,**如下:
for (int i = 1; i <= n; ++i)
for (int j = n, t; j > i; ‐‐j)
if (p[j ‐ 1] > p[j])
t = p[j], p[j] = p[j ‐ 1], p[j ‐ 1] = t;
在排序過程中,數字的位置可能會發生變化。對於1~n的每個數字,你需要輸出過程中達到的最左位置下標和最右位置下標的差的絕對值。
80%的資料:n<=1000
100%的資料:n<=100000
輸入示例
4
3 2 1 4
輸出示例
2 1 2 0
hint
樣例氣泡排序過程:
swap 2 1: 3 2 1 4 > 3 1 2 4
swap 3 1: 3 1 2 4 > 1 3 2 4
swap 3 2: 1 3 2 4 > 1 2 3 4
這道題目的破題點在於如何將每個數字到達的最左側和最右側的位置找到。需要自己多模擬幾次過程,就可以發現:每個數字到達的最右側位置,其實就是看這個數字的右側有幾個比他小的數字,而最左側位置就取初始位置和排序完成後的位置中較小的那乙個。
考慮到資料的大小,需要採用歸併的思想來解答。
#includeusing namespace std;
int main()
for (int i = n-1; i >= 0; i--)
}} for (int i = 0; i < n; i++)
}
#include#includeusing namespace std;
int right[100001] = ;
int left[100001] = ;
int pos[100001] = ;
void merge(int a, int left, int mid, int right)
for (int i = mid+1; i <= right; i++)
while (l_pos <= mid && r_pos <= right)
else
}while (l_pos <= mid)
while (r_pos <= right) }
void msort(int a, int left, int right) }
int min(int a, int b)
int main()
msort(a, 1, n);
for (int i = 1; i <= n; i++)
}
演算法與資料結構實驗題 5.18 小孩的遊戲
★實驗任務
一群小孩子在玩遊戲,遊戲規則是這樣子,給了一些卡片,上面有數字,現在要把卡片按照某一種序列排好,讓這些數字重新鏈結組合成乙個大數,求最大的數是什麼。
★資料輸入
第一行乙個整數n
接下來n行,每行乙個整數ai,為第i張卡片上的數值。(0<=ai<=100)
50%資料 1<=n<=50000
100%資料1<=n<=100000
★資料輸出
輸出重新組合好的大數。
輸入示例
3
9923
99
輸出示例
999923
採用的是桶排序的思想
#includeusing namespace std;
int main()
; int n;
cin >> n;
int m;
for (int i = 0; i < n; i++)
for (int i = 9; i >= 1; i--)
}while (a[i] != 0)
for (int j = i - 1; j >= 0; j--)
}} else
}} }
while (a[100] != 0)
while (a[0] != 0)
}
第五次作業
一 問題及 include using namespace std class time void add a minute void add an hour void add seconds int n void add minutes int n void add hours int n voi...
第五次作業
當我們在討論多型性的時候,通常會用過載函式進行舉例,而這次發現的問題主要在過載運算子上,因此我希望通過對過載運算子的測試來得出乙個結論。我們想知道為什麼前置運算子和後置運算子會有區別,因此設計了乙個實驗來證明它 得到最終結果如預期那樣。通過這次作業,我能感受到前置和後置運算子的區別,通過x 和y x...
第五次作業
insert into student sno,sname,s sdept,sage values 201215128 陳冬 男 is 18 建表時規定學號唯一,而在建表時已經加入了該學號,所以不能有兩個相同學號。3.70 insert into student sno,sname,s sdept,...