資料結構-簡單選擇排序(含全部程式碼)
阿新 • • 發佈:2018-12-10
函式分析如下:
SelectSort(SqList &L) 引數:順序表L 功能:排序(預設升序)空間複雜度:O(1) 時間複雜度:O(n方) 穩定性:不穩定 思想:假設第i個值為當前最小值(0到i-1已經為升序,且均小於或等於第i個值),令min=i,從i+1向後比較,若小於第i個值 記錄下標(令min等於該元素下標),直至最後一個,若min不等於i說明後面有比第i個值小的元素,則交換。
程式碼:
void SelectSort(SqList &L) { int min;int temp; for(int i=0;i<L.length;i++) { min=i; for(int j=i+1;j<L.length;j++) { if(L.data[j]<L.data[min])min=j; } if(min!=i) { temp=L.data[min]; L.data[min]=L.data[i]; L.data[i]=temp; } } }
全部程式碼:
/* Project: sequence_list(資料結構-順序表) Date: 2018/09/12 Author: Frank Yu SelectSort(SqList &L) 引數:順序表L 功能:排序(預設升序)空間複雜度:O(1) 時間複雜度:O(n方) 穩定性:不穩定 思想:假設第i個值為當前最小值(0到i-1已經為升序,且均小於或等於第i個值),令min=i,從i+1向後比較,若小於第i個值 記錄下標(令min等於該元素下標),直至最後一個,若min不等於i說明後面有比第i個值小的元素,則交換。 */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #define MaxSize 100 #define ElemType int #define Status int using namespace std; //順序表資料結構 typedef struct { ElemType data[MaxSize];//順序表元素 int length; //順序表當前長度 }SqList; //***************************基本操作函式*******************************// //初始化順序表函式,構造一個空的順序表 Status InitList(SqList &L) { memset(L.data,0,sizeof(L));//初始化資料為0 L.length=0; //初始化長度為0 return 0; } //建立順序表函式 初始化前n個數據 bool CreatList(SqList &L,int n) { if(n<0||n>MaxSize)false;//n非法 for(int i=0;i<n;i++) { scanf("%d",&L.data[i]); L.length++; } return true; } //插入函式 位置i插入資料 i及之後元素後移 1=<i<=length+1 bool InsertList(SqList &L,int i,ElemType e) { if(i<1||i>L.length+1) //判斷位置是否有效 { printf("位置無效!!!\n"); return false; } if(L.length>=MaxSize)//判斷儲存空間是否已滿 { printf("當前儲存空間已滿!!!\n"); return false; } for(int j=L.length;j>=i;j--)//位置i及之後元素後移 { L.data[j]=L.data[j-1]; } L.data[i-1]=e; L.length++; return true; } //刪除函式 刪除位置i的元素 i之後的元素依次前移 bool ListDelete(SqList &L,int i) { if(i<1||i>L.length) { printf("位置無效!!!\n"); return false; } for(int j=i;j<=L.length-1;j++)//位置i之後元素依次前移覆蓋 { L.data[j-1]=L.data[j]; } L.length--; return true; } //查詢函式 按位置從小到大查詢第一個值等於e的元素 並返回位置 int LocateElem(SqList L,ElemType e) { for(int i=0;i<L.length;i++)//從低位置查詢 { if(L.data[i]==e) return i+1; } return 0; } //********************************功能函式*****************************************// //輸出功能函式 按位置從小到大輸出順序表所有元素 void PrintList(SqList L) { printf("當前順序表所有元素:"); for(int i=0;i<L.length;i++) { printf("%d ",L.data[i]); } printf("\n"); } //建立順序表函式 void Create(SqList &L) { int n;bool flag; printf("請輸入要建立的順序表長度(>1):"); scanf("%d",&n); printf("請輸入%d個數(空格隔開):",n); flag=CreatList(L,n); if(flag){ printf("建立成功!\n"); PrintList(L); } else printf("輸入長度非法!\n"); } //插入功能函式 呼叫InsertList完成順序表元素插入 呼叫PrintList函式顯示插入成功後的結果 void Insert(SqList &L) { int place;ElemType e;bool flag; printf("請輸入要插入的位置(從1開始)及元素:\n"); scanf("%d%d",&place,&e); flag=InsertList(L,place,e); if(flag) { printf("插入成功!!!\n"); PrintList(L); } } //刪除功能函式 呼叫ListDelete函式完成順序表的刪除 呼叫PrintList函式顯示插入成功後的結果 void Delete(SqList &L) { int place;bool flag; printf("請輸入要刪除的位置(從1開始):\n"); scanf("%d",&place); flag=ListDelete(L,place); if(flag) { printf("刪除成功!!!\n"); PrintList(L); } } //查詢功能函式 呼叫LocateElem查詢元素 void Search(SqList L) { ElemType e;int flag; printf("請輸入要查詢的值:\n"); scanf("%d",&e); flag=LocateElem(L,e); if(flag) { printf("該元素位置為:%d\n",flag); } else printf("未找到該元素!\n"); } //簡單選擇排序 升序排序 void SelectSort(SqList &L) { int min;int temp; for(int i=0;i<L.length;i++) { min=i; for(int j=i+1;j<L.length;j++) { if(L.data[j]<L.data[min])min=j; } if(min!=i) { temp=L.data[min]; L.data[min]=L.data[i]; L.data[i]=temp; } } PrintList(L); } //選單 void menu() { printf("********1.建立 2.插入*********\n"); printf("********3.刪除 4.查詢*********\n"); printf("********5.簡單排序 6.輸出*********\n"); printf("********7.退出\n"); } int main() { SqList L;int choice; InitList(L); while(1) { menu(); printf("請輸入選單序號:\n"); scanf("%d",&choice); if(7==choice) break; switch(choice) { case 1:Create(L);break; case 2:Insert(L);break; case 3:Delete(L);break; case 4:Search(L);break; case 5:SelectSort(L);break; case 6:PrintList(L);break; default:printf("輸入錯誤!!!\n"); } } return 0; }
結果截圖:
有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。