




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、#include"stdio.h"#include"math.h"#include"stdlib.h"#include"malloc.h"#define Maxsize 10000000#define N 20#define EQ(a,b) (a)=(b)#define LT(a,b) (a)<(b)#define LQ(a,b) (a)<=(b)#define LEN sizeof(SqList)#define Maxr 10#define MAXNUM 100000000typedef struct
2、 nodeint key; int num;node;typedef struct struct node rMaxsize+1; long length;SqList,*qSqList;typedef struct node2struct node r; struct node2 *next;RecType;long shifttimes;/統計移動次數long comparetimes;/統計比較次數qSqList creat(char filename)/讀入文件并且將數據保存FILE *fp;long i;qSqList L;L=(qSqList)malloc(LEN);L->l
3、ength=0;if(fp=fopen(filename,"r")=NULL)/文件不存在時終止程序 printf("cannot open filen"); exit(0);for(i=1;i<Maxsize+1;i+) fscanf(fp,"%ld (%d)",&(L->ri.key),&(L->ri.num); if(L->ri.key<0)break; L->length+;/記錄讀入的數據長度fclose(fp); return(L);void Print2(qSqList
4、 L)/將序列輸出到指定的文件中long i;FILE *fp;char filenameN; printf("nt請輸入存儲文件名:"); scanf("%s",filename);/輸入將要儲存的文件名 fp=fopen(filename,"w"); for(i=1;i<=L->length;i+)/將鏈表中數據逐一寫入文件中fprintf(fp,"%d (%d)n",L->ri.key,L->ri.num); fclose(fp);void Print(qSqList L)/打印數據個
5、數以及排序過程中的比較次數和移動次數printf("nt數據個數:%ld",L->length); printf("nt比較次數:%ld",comparetimes); printf("nt移動次數:%ld",shifttimes);struct node Min1(struct node a,struct node b)/比較兩接點關鍵字的大小struct node temp; if(a.key>b.key)temp=b;else temp=a; comparetimes+; return(temp);qSqList s
6、hellinsert(qSqList L,int dk)/對順序表以dk為增量作直接插入排序int i,j;for(i=dk+1;i<=L->length;i+)if(LT(L->ri.key,L->ri-dk.key)/將L->ri插入到有序增量子表L->r0=L->ri;/將L->ri暫時存儲在L->r0 shifttimes+; for(j=i-dk;j>0&&j<(L->r0.key,L->rj.key);j-=dk)/記錄后移,查找插入位置L->rj+dk=L->rj; comp
7、aretimes+; shifttimes+;if(j>0)comparetimes+; L->rj+dk=L->r0;/插入 shifttimes+; comparetimes+;/ Print(L); return(L);qSqList shell(qSqList L)/希爾排序int i,t=0; int k; for(t=0;LQ(pow(2,t),(L->length+1);t+); t=t-1; / printf("%d",t); for(i=1;i<=t;+i) k=(int)pow(2,t-i+1)-1;/計算排序增量 L=sh
8、ellinsert(L,k); Print(L); Print2(L); return(L);long Quicksort(qSqList L,long low,long high)/交換順序表L中子表L->rlow.high的記錄,使樞軸記錄到位,并返回其所在位置int pivotkey; pivotkey=L->rlow.key;/用序列的第一個記錄作樞軸記錄 while(low<high)/從表的兩端交替地向中間掃描 while(low<high&&L->rhigh.key>=pivotkey)/將比樞軸記錄小的記錄交換到低端compa
9、retimes+; high-; comparetimes+; L->r0=L->rlow; shifttimes+; L->rlow=L->rhigh; shifttimes+; L->rhigh=L->r0; shifttimes+; while(low<high&&L->rlow.key<=pivotkey)/將比樞軸記錄大的記錄交換到高端comparetimes+; low+; comparetimes+; L->r0=L->rlow; shifttimes+; L->rlow=L->rhig
10、h; shifttimes+; L->rhigh=L->r0; shifttimes+; return(low);/返回樞軸所在位置qSqList Quick2(qSqList L,long low,long high)/對順序表L中的子序列L.rlow.high作快速排序long pivot; if(low<high)/序列長度大于1pivot=Quicksort(L,low,high);/將序列一分為二 Quick2(L,low,pivot-1);/對低位子表遞歸排序 Quick2(L,pivot+1,high);/對高位子表遞歸排序 return(L);qSqList
11、Quick(qSqList L)/對順序表作快速排序long low,high; low=1;/將第一個數據所在位置定義為低位 high=L->length;/將最后一個數據所在位置定義為高位 L=Quick2(L,low,high);/對順序表作快速排序 Print(L); Print2(L); return(L);void TourSort(SqList *L,long n)/錦標賽排序 qSqList Lp; long i=0,t=1,k=1,w; while(t<n)/t表示完全二叉樹的結點個數t=(long)pow(2,i); i+; t=2*t; Lp=(qSqList
12、)malloc(sizeof(SqList); Lp->length=t-1; for(i=t-1;i>=t/2;i-)if(k>n)Lp->ri.key=MAXNUM; else Lp->ri=L->rk; shifttimes+; k+; i=t-1; while(i!=1)Lp->ri/2=Min1(Lp->ri,Lp->ri-1); i-=2; comparetimes+; shifttimes+; for(i=1;i<=n;i+)L->ri=Lp->r1; shifttimes+; w=1; while(w<
13、;t/2)if(Lp->r2*w.key=Lp->rw.key)w*=2; else w=2*w+1; Lp->rw.key=MAXNUM;/將其賦為最大值 shifttimes+; if(w%2)Lp->rw/2=Lp->rw-1; else Lp->rw/2=Lp->rw+1; shifttimes+; while(w!=1) if(w%2) Lp->rw/2=Min1(Lp->rw,Lp->rw-1); else Lp->rw/2=Min1(Lp->rw,Lp->rw+1); comparetimes+; sh
14、ifttimes+; w/=2; Print(L); Print2(L); void Heapadjust(qSqList L,long s,long m)/調整L->s的關鍵字,使L->rs.m成為一個大頂堆long j; struct node rc; rc=L->rs; for(j=2*s;j<=m;j*=2)/沿key較大的接點向下篩選 if(j<m&&j<(L->rj.key,L->rj+1.key)/j為key較大的記錄的下標j+; comparetimes+; if(!LT(rc.key,L->rj.key)
15、comparetimes+; break; L->rs=L->rj;/rc插入位置s shifttimes+; s=j; L->rs=rc;/插入 shifttimes+;qSqList Heap(qSqList L)/堆排序long i;for(i=L->length/2;i>0;-i)/把L建成大頂堆 Heapadjust(L,i,L->length); for(i=L->length;i>1;-i)/將堆頂記錄和當前未經排序子序列中最后一個記錄交換L->r0=L->r1; L->r1=L->ri; L->ri=
16、L->r0; shifttimes=shifttimes+3; Heapadjust(L,1,i-1);/將L重新調整為大頂堆 Print(L); Print2(L); return(L);void Merge(qSqList L,int low,int m,int high)/將兩個有序表Rlow.mhe Rm+1.high歸并為一個有序表Rlow,highint i=low,j=m+1,k=0;/k是temp的下標,i,j分別為第1,2段的下標 struct node *temp; temp=(struct node*)malloc(high-low+1)*sizeof(struct
17、 node);/用于臨時保存有序序列 while(i<=m&&j<=high)/在第1段和第2段均未掃描完時循環 if(LT(L->rj.key,L->ri.key)/將第1段中的記錄放入temp中 tempk=L->rj; j+; k+; else/將第2段中的記錄放入temp中 tempk=L->ri; k+; i+; while(i<=m)/將第1段余下的部分復制到temp tempk=L->ri; k+; i+; while(j<=high)/將第2段余下的部分復制到temp tempk=L->rj; k+;
18、j+; for(k=0,i=low;i<=high;i+,k+)/將temp復制回L中 L->ri=tempk;void MSort(qSqList L,int low,int high)/二路歸并排序int m; if (low<high) m=(low+high)/2; MSort(L,low,m); MSort(L,m+1,high); Merge(L,low,m,high);void Merging(qSqList L)/歸并排序MSort(L,1,L->length); Print2(L);void Radixsort(qSqList L)/基數排序int g
19、,i,j,k,d=2; struct node2 *p,*s,*t,*head10,*tail10;/定義各鏈隊的首尾指針 for(i=1;i<=L->length;i+) /建立鏈表 s = (struct node2*)malloc(sizeof(struct node2); s->r.key = L->ri.key; s->r.num= L->ri.num; if(i=1) t = s; p = s; g+; else t->next = s; t = s; g+; t->next = NULL; d=1; for(i=1;i<6;i
20、+) for(j=0;j<10;j+)headj = tailj = NULL; /初始化各鏈隊首、尾指針 while(p!=NULL)/對于原鏈表中的每個結點循環 k = p->r.key/d; k = k%10; if(headk=NULL)/進行分配 headk=p; tailk=p; else tailk->next=p; tailk=p; p = p->next;/取下一個待排序的元素 p=NULL; for(j=0;j<10;j+)/對每一個鏈隊循環 if(headj!=NULL)/進行搜集 if(p = NULL) p = headj; t = ta
21、ilj; else t->next=headj; t = tailj; t->next=NULL;/最后一個結點的next置為空 d=d*10; i=1; while(p!=NULL) L->ri = p->r; i+; p=p->next; Print2(L);char chmenu()/對排序方法進行選擇char ch; printf("nt請選擇排序方法:" "nt*" "nt1.Shell排序" "nt2.Quick排序" "nt3.錦標賽排序" "
22、;nt4.堆排序" "nt5.歸并排序" "nt6.基排序" "nt7.結束" "nt*"); doprintf("ntplease choose (1-7):"); getchar(); ch=getchar(); while(!(ch>'0'&&ch<'8'); return(ch);void main()int a=1; FILE *fp; char ch,filenameN; qSqList L; while(a) printf("nt請輸入讀入文件名:");/輸入要讀入的文件名 scanf("%s&quo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西方政治理論與實踐的結合分析試題及答案
- 網絡工程師的未來發展方向試題及答案
- 西方國家政治外交中的人權問題試題及答案
- 經濟政策與科技創新試題及答案
- 西方選舉制度的演變試題及答案
- 深度分析西方國家的政治演變試題及答案
- 深入解析四級軟件測試工程師典型試題及答案
- 數據庫設計在2025年軟件設計師考試中的試題及答案
- 機電工程考試難點透析與試題及答案
- 公共政策對未來就業的影響試題及答案
- 職業暴露與防試題及答案
- 2025年高考政治搶押秘籍(江蘇專用)時政熱點03發展民營經濟-(江蘇專用)(學生版+解析)
- 2025年四川省成都市錦江區中考二診物理試題(含答案)
- 2025年安徽高考歷史模擬預測試卷(含答案解析)
- DB34T 4720-2024工會驛站運維服務規范
- 安川機器人手動操縱及編程基礎
- 焊接設備維護與保養試題及答案
- 《民間借貸法規解析》課件
- 藍色簡約風美國加征關稅
- 規范種植品種管理制度
- 廣東省深圳市羅湖區2025年高三第三次調研測試英語試題試卷含解析
評論
0/150
提交評論