資料結構 排序(氣泡排序改進,簡單選擇排序連結串列實現)
阿新 • • 發佈:2019-02-10
實驗題目: 排序演算法實現與比較
實驗環境: Visual C++ 6.0
實驗八:
實驗目的和要求:熟悉多種排序演算法,理解每種排序演算法思想,掌握排序演算法的基本設計方法,掌握排序演算法時間複雜度和空間複雜度的分析方法。
實驗內容:1.對所講過演算法深入理解。
2. 將氣泡排序再做進一步的優化。如果有100個數的陣列,當前僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在該一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的資料必定已經有序了,記錄下這位置,下次只要從陣列頭部遍歷到這個位置就可以了。
3. 試以單鏈表為儲存結構,實現簡單選擇排序演算法。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #define MAXSIZE 20 using namespace std; typedef struct { int key; char *otherinfor; }ElemType; typedef struct { ElemType *r; int length; }SqList; void BubbleSort(SqList &L)//氣泡排序 { int c,i,m=L.length; ElemType t; while(m>0) { for(c=0,i=1;i<m;i++) { if(L.r[i].key>L.r[i+1].key) { t=L.r[i]; L.r[i]=L.r[i+1]; L.r[i+1]=t; c=i; } } m=c; } } void CreatSqList(SqList &L) { int i,n; printf("請輸入資料個數(<MAXSIZE)\n"); scanf("%d",&n); printf("請輸入待排序的序列\n"); for(i=1;i<=n;i++) { scanf("%d",&L.r[i].key); L.length++; } } void ShowSqList(SqList L) { int i; for(i=1;i<=L.length;i++) { cout<<L.r[i].key<<endl; } printf("\n"); } typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; void InitList(LinkList &L) { L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; } void IntPut(LinkList &L,int m) { int i; LinkList r,p; r=L; for(i=0;i<m;i++) { p=(LNode*)malloc(sizeof(LNode)); cin>>p->data; p->next=NULL; r->next=p; r=p; } } void OutPut(LinkList &L) { LinkList p; p=(LNode*)malloc(sizeof(LNode)); p=L->next; while(p) { printf("%d ",p->data); p=p->next; } } void SelectSort(LinkList &L)//簡單選擇排序 { LinkList r,q,p=L->next; int t; while(p) { q=p->next; r=p; while(q) { if(q->data<r->data) r=q; q=q->next; } if(r!=p) { t=r->data; r->data=p->data; p->data=t; } p=p->next; } } int main() { SqList L; LinkList Q; int m; L.r=(ElemType*)malloc(sizeof(ElemType)); L.length=0; CreatSqList (L); BubbleSort(L); ShowSqList(L); printf("請輸入需要排序的數的個數\n"); scanf("%d",&m); InitList(Q); IntPut(Q,m); SelectSort(Q); OutPut(Q); }