// _DataStructure_C_Impl:Sort
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int KeyType;
//数据元素类型定义
typedef struct{KeyType key; //keyword
}DataType;
//顺序表类型定义
typedef struct{DataType data[MaxSize];int length;
}SqList;
//---------------------------------------------
//直接插入排序
void InsertSort(SqList *L){int i,j;DataType t;for(i=1;i<L->length;i++){        //前i个元素已经有序,从第i+1个元素開始与前i个的有序的keyword比較t=L->data[i+1];     //取出当前待排序的元素j=i;while(j>-1&&t.key<L->data[j].key){        //找当前元素的合适位置L->data[j+1]=L->data[j];j--;}L->data[j+1]=t;       //将当前元素插入合适的位置}
}
//---------------------------------------------
//折半插入排序
void BinInsertSort(SqList *L){int i,j,mid,low,high;DataType t;for(i=1;i<L->length;i++){        //前i个元素已经有序,从第i+1个元素開始与前i个的有序的keyword比較t=L->data[i+1];     //取出第i+1个元素。即待排序的元素low=1;high=i;while(low<=high){        //利用折半查找思想寻找当前元素的合适位置mid=(low+high)/2;if(L->data[mid].key>t.key)high=mid-1;elselow=mid+1;}for(j=i;j>=low;j--)       //移动元素,空出要插入的位置L->data[j+1]=L->data[j];L->data[low]=t;   //将当前元素插入合适的位置}
}
//---------------------------------------------
//对顺序表L进行一次希尔排序,delta是增量
void ShellInsert(SqList *L,int delta){int i,j;DataType t;for(i=delta+1;i<=L->length;i++){    //将距离为delta的元素作为一个子序列进行排序if(L->data[i].key<L->data[i-delta].key){  //假设后者小于前者,则须要移动元素t=L->data[i];for(j=i-delta;j>0&&t.key<L->data[j].key;j=j-delta)L->data[j+delta]=L->data[j];L->data[j+delta]=t;     //依次将元素插入到正确的位置}}
}
//希尔排序。每次调用算法ShellInsert,delta是存放增量的数组
void ShellInsertSort(SqList *L,int delta[],int m){int i;for(i=0;i<m;i++)  //进行m次希尔插入排序ShellInsert(L,delta[i]);
}
void ShellInsertSort2(SqList *L,int gap){while(gap>0){ShellInsert(L,gap);gap/=2;}
}
//---------------------------------------------
//简单选择排序
void SelectSort(SqList *L,int n){int i,j,k;DataType t;//将第i个元素的keyword与后面[i+1...n]个元素的keyword比較,将keyword最小的的元素放在第i个位置for(i=1;i<=n-1;i++){k=i;for(j=i+1;j<=n;j++)    //keyword最小的元素的序号为kif(L->data[j].key<L->data[k].key)k=j;if(k!=i){    //假设序号i不等于k,则须要将序号i和序号k的元素交换t=L->data[i];L->data[i]=L->data[k];L->data[k]=t;}}
}
//---------------------------------------------
//调整H.data[s...m]的keyword,使其成为一个大顶堆
void AdjustHeap(SqList *H,int s,int m){DataType t;int j;t=(*H).data[s];    //将根结点临时保存在t中for(j=2*s;j<=m;j*=2){    if(j<m&&(*H).data[j].key<(*H).data[j+1].key) //沿keyword较大的孩子结点向下筛选j++;     //j为keyword较大的结点的下标if(t.key>(*H).data[j].key)    //假设孩子结点的值小于根结点的值,则不进行交换break;(*H).data[s]=(*H).data[j];s=j;}(*H).data[s]=t;  //将根结点的值插入到正确位置
}
//建立大顶堆
void CreateHeap(SqList *H,int n){int i;for(i=n/2;i>=1;i--) //从序号n/2開始建立大顶堆AdjustHeap(H,i,n);
}
//对顺序表H进行堆排序
void HeapSort(SqList *H){DataType t;int i;CreateHeap(H,H->length);       //创建堆for(i=(*H).length;i>1;i--){    //将堆顶元素与最后一个元素交换。又一次调整堆t=(*H).data[1];(*H).data[1]=(*H).data[i];(*H).data[i]=t;AdjustHeap(H,1,i-1);      //将(*H).data[1..i-1]调整为大顶堆}
}
//---------------------------------------------
//输出表中的元素
void DispList3(SqList L,int count){int i;printf("第%d趟排序结果:",count);for(i=1;i<=L.length;i++)printf("%4d",L.data[i].key);printf("\n");
}
//冒泡排序
void BubbleSort(SqList *L,int n){int i,j,flag=1;DataType t;static int count=1;for(i=1;i<=n-1&&flag;i++){       //须要进行n-1趟排序flag=0;        //标志位。若以有序,不须要进行以下的排序for(j=1;j<=n-i;j++)      //每一趟排序须要比較n-i次if(L->data[j].key>L->data[j+1].key){   t=L->data[j];       L->data[j]=L->data[j+1];L->data[j+1]=t;flag=1;}DispList3(*L,count);count++;}
}
//---------------------------------------------
/*对顺序表L.r[low..high]的元素进行一趟排序,使枢轴前面的元素keyword小于
枢轴元素的keyword,枢轴后面的元素keyword大于等于枢轴元素的keyword。并返回枢轴位置*/
int Partition(SqList *L,int low,int high){DataType t;KeyType pivotkey;pivotkey=(*L).data[low].key;     //将表的第一个元素作为枢轴元素t=(*L).data[low];while(low<high){       //从表的两端交替地向中间扫描while(low<high&&(*L).data[high].key>=pivotkey)    //从表的末端向前扫描high--;if(low<high){      //将当前high指向的元素保存在low位置(*L).data[low]=(*L).data[high];low++;}while(low<high&&(*L).data[low].key<=pivotkey) //从表的始端向后扫描low++;if(low<high){     //将当前low指向的元素保存在high位置(*L).data[high]=(*L).data[low];high--;}}(*L).data[low]=t;   //将枢轴元素保存在low=high的位置return low;       //返回枢轴所在位置
}
//
void DispList2(SqList L,int pivot,int count){int i;printf("第%d趟排序结果:[",count);for(i=1;i<pivot;i++)printf("%-4d",L.data[i].key);printf("]");printf("%3d ",L.data[pivot].key);printf("[");for(i=pivot+1;i<=L.length;i++)printf("%-4d",L.data[i].key);printf("]");printf("\n");
}
//对顺序表L进行高速排序
void QSort(SqList *L,int low,int high){int pivot;static int count=1;if(low<high){       //假设元素序列的长度大于1pivot=Partition(L,low,high); //将待排序序列L.r[low..high]划分为两部分DispList2(*L,pivot,count);  //输出每次划分的结果count++;QSort(L,low,pivot-1);  //对左边的子表进行递归排序,pivot是枢轴位置QSort(L,pivot+1,high); //对右边的子表进行递归排序}
}
//对顺序表L作高速排序
void QuickSort(SqList *L){QSort(L,1,(*L).length);
}
//---------------------------------------------
//将有序的s[low...mid]和s[mid+1..high]归并为有序的t[low..high]
void Merge(DataType s[],DataType t[],int low,int mid,int high){int i,j,k;i=low;j=mid+1;k=low;while(i<=mid&&j<=high){        //将s中元素由小到大地合并到tif(s[i].key<=s[j].key)t[k]=s[i++];elset[k]=s[j++];k++;}while(i<=mid)        //将剩余的s[i..mid]拷贝到tt[k++]=s[i++];while(j<=high)        //将剩余的s[j..high]拷贝到tt[k++]=s[j++];
}
//2路归并排序,将s[low...high]归并排序并存储到t[low...high]中
void MergeSort(DataType s[],DataType t[],int low,int high){int mid;DataType t2[MaxSize];if(low==high)t[low]=s[low];else{mid=(low+high)/2;      //将s[low...high]平分为s[low...mid]和s[mid+1...high]MergeSort(s,t2,low,mid);    //将s[low...mid]归并为有序的t2[low...mid]MergeSort(s,t2,mid+1,high);  //将s[mid+1...high]归并为有序的t2[mid+1...high]Merge(t2,t,low,mid,high); //将t2[low...mid]和t2[mid+1..high]归并到t[low...high]}
}
void InitSeqList1(SqList *L,DataType a[],int start,int n)
{int i,k;for(k=1,i=start;i<start+n;i++,k++){L->data[k]=a[i];}L->length=n;}
//---------------------------------------------
//顺序表的初始化
void InitSeqList(SqList *L,DataType a[],int n){int i;for(i=1;i<=n;i++){L->data[i]=a[i-1];}L->length=n;
}
//输出表中的元素
void DispList(SqList L){int i;for(i=1;i<=L.length;i++)printf("%4d",L.data[i].key);printf("\n");
}
void main(){DataType a[]={56,22,67,32,59,12,89,26,48,37};int delta[]={5,3,1};int gap=5;int i,n=10,m=3;SqList L;printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*直接插入排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);InsertSort(&L);printf("直接插入排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*折半插入排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);BinInsertSort(&L);printf("折半插入排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*希尔排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);ShellInsertSort(&L,delta,m);printf("希尔排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*希尔排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);ShellInsertSort2(&L,gap);printf("希尔排序2结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*简单选择排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);SelectSort(&L,n);printf("简单选择排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*堆排序*/InitSeqList(&L,a,n);printf("排序前:");DispList(L);HeapSort(&L);printf("堆排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");DataType b[]={37,22,43,32,19,12,89,26,48,92};/*冒泡排序*/InitSeqList(&L,b,n);printf("冒泡排序前:");DispList(L);BubbleSort(&L,n);printf("冒泡排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*高速排序*/InitSeqList(&L,b,n);printf("高速排序前:");DispList(L);QuickSort(&L);printf("高速排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");/*归并排序*/DataType c[MaxSize];InitSeqList(&L,b,n);    /*将数组a[0...n-1]初始化为顺序表L*/printf("归并排序前:");DispList(L);MergeSort(L.data,c,1,n);InitSeqList1(&L,c,1,n);  /*将数组c[1...n]初始化为顺序表L*/printf("归并排序结果:");DispList(L);printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");system("pause");
}

_DataStructure_C_Impl:SeqListBasedSort相关推荐

  1. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

  2. _DataStructure_C_Impl:共享栈

    // _DataStructure_C_Impl:共享栈 #include<stdio.h> #include<stdlib.h> #define StackSize 100 ...

  3. _DataStructure_C_Impl:稀疏矩阵三元组

    #include<stdlib.h> #include<stdio.h>#define MaxSize 200 typedef int DataType; typedef st ...

  4. _DataStructure_C_Impl:求图G中从顶点u到顶点v的一条简单路径

    #pragma once #include<stdio.h> #include<stdlib.h> #define StackSize 100 typedef int Data ...

最新文章

  1. mitmdump 脚本使用python第三方包方法(报错:in script xxx.py: No module named ‘xxx‘)
  2. 算法系列之使用赫夫曼编码的实战应用【对文件进行压缩、解压缩】
  3. python的业务场景_python| Binlog务应用场景
  4. POJ 1182 食物链,并查集的拓展
  5. Cannot resolve bean 'xxx' less... (Ctrl+F1) Inspection info:Checks autowir
  6. 统计犁过的田の面积(洛谷P2956题题解,Java语言描述)
  7. 003.DNS主从正反解析部署
  8. 利用 S3-tests 测试 S3 接口兼容性
  9. 学会Zynq(15)UDP sendto函数的使用
  10. 【思维模型】拥抱复杂性(第 1 部分)
  11. 腾讯的wifi硬件“全民wifi”正是亮相,有何值得期待
  12. jQuery UI 实例 - 滑块(Slider)
  13. 以前收入高,但毫无上进心,40岁一身房贷,被裁后找个小公司,天天担心试用期过不了,焦虑地睡不着!...
  14. 名字作诗,让你的名片更具有趣味性和个性化
  15. 代码 马佳义_马佳义 教授
  16. 方舟:生存进化官服和私服区别
  17. Android传感器系列介绍-刘宇
  18. 鼠标在用了一段之后偶然发现以给特别慢的速度移动鼠标,会在移动到可点击的选项按钮附近明显的卡住问题。
  19. 浏览器设置跨域及允许携带cookie
  20. Could not find parameter map com.itcast.mapper.userinfMapper.map

热门文章

  1. [转]SQL语句大全
  2. VS切换到按F5不需要按Fn键的快捷键模式
  3. 32位处理器的寄存器介绍
  4. LeetCode集锦(十) - 第28题 Implement StrStr
  5. 新加坡计划通过区块链促进东盟金融包容性
  6. 嵌入式开发之hi3519---PCIE DMA
  7. Windows 10如何禁用Microsoft Edge标签页预览
  8. 多线程环境中安全使用集合API(含代码)
  9. Git中的AutoCRLF与SafeCRLF换行符问题
  10. Oulipo(kmp算法)