日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第十五周 内部排序一(2)验证交换排序

發布時間:2024/3/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十五周 内部排序一(2)验证交换排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* * Copyright (c)2017,煙臺大學計算機與控制工程學院 * All rights reserved. * 文件名稱:項目1-2.cbp * 作 者:孫仁圓 * 完成日期:2017年12月26日 * 版 本 號:v1.0 * 問題描述:驗證希爾排序、快速排序和堆排序 * 輸入描述:無 * 程序輸出:測試數據 */
//希爾排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定義關鍵字類型 typedef char InfoType[10]; typedef struct //記錄類型 { KeyType key; //關鍵字項 InfoType data; //其他數據項,類型為InfoType } RecType; //排序的記錄類型定義 void ShellSort(RecType R[],int n) //希爾排序算法 { int i,j,gap; RecType tmp; gap=n/2; //增量置初值 while (gap>0) { for (i=gap; i<n; i++) //對所有相隔gap位置的所有元素組進行排序 { tmp=R[i]; j=i-gap; while (j>=0 && tmp.key<R[j].key)//對相隔gap位置的元素組進行排序 { R[j+gap]=R[j]; j=j-gap; } R[j+gap]=tmp; j=j-gap; } gap=gap/2; //減小增量 } } int main() { int i,n=11; RecType R[MaxSize]; KeyType a[]= {16,25,12,30,47,11,23,36,9,18,31}; for (i=0; i<n; i++) R[i].key=a[i]; printf("排序前:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); ShellSort(R,n); printf("排序后:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); return 0; }

//快速排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定義關鍵字類型 typedef char InfoType[10]; typedef struct //記錄類型 { KeyType key; //關鍵字項 InfoType data; //其他數據項,類型為InfoType } RecType; //排序的記錄類型定義 void QuickSort(RecType R[],int s,int t) //對R[s]至R[t]的元素進行快速排序 { int i=s,j=t; RecType tmp; if (s<t) //區間內至少存在兩個元素的情況 { tmp=R[s]; //用區間的第1個記錄作為基準 while (i!=j) //從區間兩端交替向中間掃描,直至i=j為止 { while (j>i && R[j].key>=tmp.key) j--; //從右向左掃描,找第1個小于tmp.key的R[j] R[i]=R[j]; //找到這樣的R[j],R[i]"R[j]交換 while (i<j && R[i].key<=tmp.key) i++; //從左向右掃描,找第1個大于tmp.key的記錄R[i] R[j]=R[i]; //找到這樣的R[i],R[i]"R[j]交換 } R[i]=tmp; QuickSort(R,s,i-1); //對左區間遞歸排序 QuickSort(R,i+1,t); //對右區間遞歸排序 } } int main() { int i,n=10; RecType R[MaxSize]; KeyType a[]= {16,25,12,30,47,11,23,36,9,18,31}; for (i=0; i<n; i++) R[i].key=a[i]; printf("排序前:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); QuickSort(R,0,n-1); printf("排序后:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); return 0; }

//堆排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定義關鍵字類型 typedef char InfoType[10]; typedef struct //記錄類型 { KeyType key; //關鍵字項 InfoType data; //其他數據項,類型為InfoType } RecType; //排序的記錄類型定義 //調整堆 void sift(RecType R[],int low,int high) { int i=low,j=2*i; //R[j]是R[i]的左孩子 RecType temp=R[i]; while (j<=high) { if (j<high && R[j].key<R[j+1].key) //若右孩子較大,把j指向右孩子 j++; //變為2i+1 if (temp.key<R[j].key) { R[i]=R[j]; //將R[j]調整到雙親結點位置上 i=j; //修改i和j值,以便繼續向下篩選 j=2*i; } else break; //篩選結束 } R[i]=temp; //被篩選結點的值放入最終位置 } //堆排序 void HeapSort(RecType R[],int n) { int i; RecType temp; for (i=n/2; i>=1; i--) //循環建立初始堆 sift(R,i,n); for (i=n; i>=2; i--) //進行n-1次循環,完成推排序 { temp=R[1]; //將第一個元素同當前區間內R[1]對換 R[1]=R[i]; R[i]=temp; sift(R,1,i-1); //篩選R[1]結點,得到i-1個結點的堆 } } int main() { int i,n=10; RecType R[MaxSize]; KeyType a[]= {57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7};//a[0]空閑,不作為關鍵字 for (i=1; i<=n; i++) R[i].key=a[i]; printf("排序前:"); for (i=1; i<=n; i++) printf("%d ",R[i].key); printf("\n"); HeapSort(R,n); printf("排序后:"); for (i=1; i<=n; i++) printf("%d ",R[i].key); printf("\n"); return 0; }

總結

以上是生活随笔為你收集整理的第十五周 内部排序一(2)验证交换排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。