演算法與資料結構實驗題 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
輸入示例
43 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++)
}
資料結構第六次作業
這個作業屬於哪個課程 這個作業要求在 homework 11430 這個作業的目標 掌握二叉樹的基本特性 掌握二叉樹的先序 中序 後序的遞迴遍歷演算法 理解二叉樹的先序 中序 後序的非遞迴遍歷演算法 通過求二叉樹的深度 葉子結點數和層序遍歷等演算法,理解二叉樹的基本特性 學號2018204183 一...
第六次作業
姓名 陳裕坤 學號 120705213 班級 12電信2班 作業1 總結,到目前為止,c語言基礎知識已介紹完,下一階段重點是指標。請從以下幾個方面小結 1.程式設計重在實踐,多程式設計才會對其理解更深,我是如何學習c語言的?2.程式設計涉及到方方面面知識,就像英語單詞一樣,一開始不可能了解每個c元素...
第六次作業
一 問題及 檔名稱 2.cpp 作 者 劉澤 完成日期 2017年5月18日 版 本 號 v1.0 對任務的求解方法及描述部分 輸入描述 問題描述 定義乙個不重複的有初值的10個元素的整數陣列a,利用冒泡法對陣列a排序 1 刪除x 2 插入x 程式輸出 問題分析 用迴圈結構進行編寫 演算法設計 in...