《數據結構》實驗報告
排序 實驗題目:
輸入十個數,從插入排序,快速排序,選擇排序三類算法中各選一種編程實現。
實驗所使用得數據結構內容及編程思路:
1、插入排序:直接插入排序得基本操作就是,將一個記錄到已排好序得有序表中,從而得到一個新得,記錄增一得有序表。
一般情況下,第 i 趟直接插入排序得操作為:在含有i—1 個記錄得有序子序列r[1、、i-1]中插入一個記錄 r[i]后,變成含有 i 個記錄得有序子序列r[1、、i];并且,與順序查找類似,為了在查找插入位置得過程中避免數組下標出界,在 r[0]處設置哨兵。在自 i-1 起往前搜索得過程中,可以同時后移記錄.整個排序過程為進行 n—1 趟插入,即:先將序列中得第一個記錄瞧成就是一個有序得子序列,然后從第 2 個記錄起逐個進行插入,直至整個序列變成按關鍵字非遞減有序序列為止。
2、快速排序:基本思想就是,通過一趟排序將待排記錄分割成獨立得兩部分,其中一部分記錄得關鍵字均比另一部分記錄得關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
假設待排序得序列為{L、r[s],L、r[s+1],…L、r[t]},首先任意選取一個記錄(通常可選第一個記錄 L、r[s])作為樞軸(或支點)(pivot),然后按下述原則重新排列其余記錄:將所有關鍵字較它小得記錄都安置在它得位置之前,將所有關鍵字較大得記錄都安置在它得位置之后。由此可以該“樞軸”記錄最后所羅得位置 i 作為界線,將序列{L、r[s],…,L、r[t]}分割成兩個子序列{L、r[i+1],L、[i+2],…,L、r[t]}。這個過程稱為一趟快速排序,或一次劃分。
一趟快速排序得具體做法就是:附設兩個指針 low與high,她們得初值分別為low與high,設樞軸記錄得關鍵字為pivotkey,則首先從high所指位置起
向前搜索找到第一個關鍵字小于 pivotkey 得記錄與樞軸記錄互相交換,然后從low所指位置起向后搜索,找到第一個關鍵字大于pivotkey得記錄與樞軸記錄互相交換,重復這兩不直至 low=high 為止。
具體實現上述算法就是,每交換一對記錄需進行 3 次記錄移動(賦值)得操作。而實際上,在排列過程中對樞軸記錄得賦值就是多余得,因為只有在一趟排序結束時,即 low=high 得位置才就是樞軸記錄得最后位置。由此可以先將樞軸記錄暫存在 r[0]得位置上,排序過程中只作 r[low]或r[high]得單向移動,直至一趟排序結束后再將樞軸記錄移至正確位置上. 整個快速排序得過程可遞歸進行。若待排序列中只有一個記錄,顯然已有序,否則進行一趟快速排序后再分別對分割所得得兩個子序列進行快速排序. 3、簡單選擇排序:其操作為,通過 n-i 次關鍵字間得比較,從 n—i+1 個記錄中選出關鍵字最小得記錄,并與第 i(1≤i≤n)個記錄交換之。
顯然,對 L、r[1…n]中得記錄進行簡單選擇排序得算法為:令i從1至 n—1,進行 n—1 趟選擇操作.可以瞧出,簡單選擇排序過程中,所需進行記錄移動得操作次數較少,其最小值為“0",最大值為 3(n-1)。然后,無論記錄得初始排列如何,所需進行得關鍵字之間得比較次數相同,均為 n(n—1)/2。
程序清單:
1.插入排序:
#include〈stdio、h〉 struct sqlist {int key[11];
int length; } insertsort(struct sqlist *l) { int i,j;
for(i=2;i〈=l—>length;i++)
if(l-〉key[i]〈l->key[i-1])
{l->key[0]=l-〉key[i];
l->key[i]=l-〉key[i-1];
for(j=i-2;l—>key[0]<l—>key[j];j--)
l—〉key[j+1]=l—>key[j];
l—>key[j+1]=l—>key[0];
} } main()
{ int i,j,k; struct sqlist num; num、length=10; for(i=1;i<=num、length;i++)scanf(”%d",&(num、key[i])); insertsort(&num); printf(“charu:”); for(i=1;i<=num、length;i++)printf (”%d ",num、key[i]); } 測試用例:
輸入:23 34 12 98 56 45 67 8 9 37
輸出:charu:8 9 12 23 34 37 45 56 67 98 2 快速排序:
#include<stdio、h> struct sqlist { int key[11]; int length; }; int partition(struct sqlist *l,int low,int high) { int pivotkey; l->key[0]=l-〉key[low]; pivotkey=l->key[low]; while(low<high)
{while(low<high&&l-〉key[high]〉=pivotkey)high--;
l->key[low]=l->key[high];
while(low<high&&l->key[low]<=pivotkey)low++;
l-〉key[high]=l—>key[low]; } l->key[low]=l—>key[0]; return low; } void qsort(struct sqlist *l,int low,int high) {int pivotloc;
if(low<high)
{pivotloc=partition(l,low,high);
qsort(l,low,pivotloc—1);
qsort(l,pivotloc+1,high);
} } void quicksort(struct sqlist *l) { qsort(l,1,l->length); } main()
{ int i,j; struct sqlist num; num、length=10; for(i=1;i<=num、length;i++)scanf(”%d",&(num、key[i])); quicksort(&num); printf(“kuaisu:”); for(i=1;i〈=num、length;i++)printf("%d ",num、key[i]); } 測試用例: 輸入:23 34 12 98 56 45 67 8 9 37
輸出:charu:8 9 12 23 34 37 45 56 67 98 3選擇排序:
#include<stdio、h> struct sqlist {int key[11];
int length; }; int selectminkey(struct sqlist *l,int a) { int i,j=a; for(i=a;i〈=l->length;i++)
if(l—>key[i]<l->key[j])j=i;
return j; } void selectsort (struct sqlist *l)
{int i,j,k;
for(i=1;i<l—>length;i++)
{j=selectminkey(l,i);
if(i!=j){k=l->key[i];
l-〉key[i]=l->key[j];
l—〉key[j]=k;}
} } main()
{ int i,j; struct sqlist num; num、length=10; for(i=1;i〈=num、length;i++)scanf("%d”,&(num、key[i])); selectsort(&num); printf(“xuanze:”); for(i=1;i<=num、length;i++)printf(”%d ”,num、key[i]); } 測試用例:
輸入:23 34 12 98 56 45 67 8 9 37
輸出:charu:8 9 12 23 34 37 45 56 67 98 編程感想: 本次編程總共使用了三種排序方法,而這三種編程方法放在一起進行編寫時,很容易就讓我們對齊難易程度有了更深刻得了解。
首先,三種排序中,我們都像查表那樣,設置了哨兵,而哨兵得使用可以減少對整個表得驗空操作,使程序更加節省空間。
其次,對于插入排序,每次都要對一段序列進行檢索,每排一次所要檢索得序列長度減一,其時間發雜度為 O(n^2)。
接著,對于快速排序,這個程序就是比較復雜得,總共就是3個函數,并且使用了遞歸得方法,這就是但就是,這種算法卻就是最優越得,平均性能也就是最好得,我在編這個程序時,對其排序得思想有了進一步得了解,并努力拿她與冒泡排序進行比較,瞧出了些許其優越性。
還有,就就是選擇排序,簡單選擇排序思路簡單,易于進行,但其時間發雜度與簡單插入排序方法一樣,都就是O(n^2),性能不如快速排序. 最后,本次試驗就是數據結構課得最后一次實驗,經過數據結構試驗課得鍛煉,使我對數據結構有了更深刻得理解,對我對其知識起到了重要得影響,增加了我編程得實踐活動,為我將來進一步學習打下了基礎。
推薦訪問: 數據結構 排序 實驗下一篇:天使與魔鬼作文
在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《