数据结构复习代码——排序算法(直接插入排序、折半插入排序、2-路插入排序、表排序)
1、排序算法(直接插入排序、折半插入排序、2-路插入排序、表排序)
#include<stdio.h> #define T int #define MAXSIZE 20 #define MAXVALUE 0x7fffffff typedef T SqList[MAXSIZE]; typedef struct SLNode { T data; int link; }SLNode; typedef SLNode Table[MAXSIZE]; //#define USER_ZERO_SPACE //交换函数 void Swap(T *a,T *b) { T tmp = *a; *a = *b; *b = tmp; } //直接插入排序---无哨兵位 void InsertSort(SqList &L,int n) { for(int i=1;i<n;++i) { if(L[i]<L[i-1]) { Swap(&L[i],&L[i-1]); for(int j=i-1;j>0&&L[j]<L[j-1];--j) { Swap(&L[j],&L[j-1]); } } } } //直接插入排序----零号位置为哨兵位置 void InsertSort1(SqList &L,int n) { for(int i=2;i<n;i++) { if(L[i] < L[i-1]) { L[0] = L[i]; L[i] = L[i-1]; int j; for(j=i-2;L[0]<L[j];--j) { L[j+1] = L[j]; } L[j+1] = L[0]; } } } //折半插入排序 void BInsertSort(SqList &L,int n) { for(int i=2;i<n;++i) //默认第一个元素已经排序好 { L[0] = L[i]; //零位置记录需要进行插入的元素 int low = 1; int high = i-1; while(low<=high) //查询适合元素插入的位置 { int mid = (low+high)/2; if(L[0]>=L[mid]) { low = mid + 1; } else{ high = mid - 1; } } //即插入位置为high+1 for(int j=i;j>high+1;--j) //移动high+1之后的元素 { L[j] = L[j-1]; } L[high+1] = L[0]; //元素插入 } } //2-路插入排序 void TWayInsertSort(SqList &L,int n) { //printf("%d \n",n); SqList TP; TP[0] = L[0]; //头元素赋值 int head = 0; int tail = 0; for(int i=1;i<n;++i) //遍历插入TP数组 { if(L[i]<TP[head]) //头插入 { head = (head-1+n)%n; TP[head] = L[i]; } else if(L[i]>TP[tail])//尾插入 { tail++; TP[tail] = L[i]; } else //中间插入 { tail++; TP[tail] = TP[tail-1]; int j=0; for(j=tail-1;L[i]<TP[(j-1+n)%n];j=(j-1+n)%n) { // printf("%d^",j); // printf("\n"); TP[j] = TP[(j-1+n)%n]; } TP[j] = L[i]; } } for(int i=0;i<n;++i) //遍历赋值回L数组 { L[i] = TP[head]; //printf("%d ",TP[head]); head = (head+1)%n; } //printf("\n"); } //表插入排序 void TableInsertSort(Table &t,int n) { t[0].link = 1; int q,p; for(int i=2;i<n;++i) { p = t[0].link; q = 0; while(p!=0&&t[p].data<=t[i].data) { q = p; p = t[p].link; } t[i].link = t[q].link; t[q].link = i; } } int main() { SqList L = {0,49,38,65,97,76,13,27,49}; int n = 9; Table tb; tb[0].data = MAXVALUE; tb[0].link = 0; for(int i=1;i<n;++i) { tb[i].data = L[i]; tb[i].link = 0; } TableInsertSort(tb,n); for(int i=0;i<n;++i) { if(tb[i].data == MAXVALUE) printf(" * "); else printf("%.2d ",tb[i].data); } printf("\n"); for(int j=0;j<n;++j) { printf("%.2d ",tb[j].link); } printf("\n"); return 0; } /* int main() { #ifdef USER_ZERO_SPACE SqList L = {0,49,38,65,97,76,13,27,49}; int n = 9; #else SqList L = {49,38,65,97,76,13,27,49}; int n=8; //InsertSort(L,n); //for(int i=1;i<n;i++) //{ // printf("%d ",L[i]); //} //InsertSort1(L,n); //BInsertSort(L,n); #endif // USER_ZERO_SPACE TWayInsertSort(L,n); #ifdef USER_ZERO_SPACE for(int i=1;i<n;i++) { printf("%d ",L[i]); } #else for(int i=0;i<n;i++) { printf("%d ",L[i]); } #endif return 0; } */