内部排序.txt
上传用户:luxijs
上传日期:2022-08-05
资源大小:2k
文件大小:5k
源码类别:

数据结构

开发平台:

Visual C++

  1. #define  MAXSIZE  8
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. /*1. 输出函数
  5. 2.直接插入排序函数
  6. 3.希尔排序函数
  7. 4.冒泡排序函数
  8. 5.快速排序函数
  9. 6.简单选择排序函数
  10. 7.堆排序函数
  11. 8.归并排序函数
  12. 9.功能选择函数*/
  13. typedef struct{
  14.   int key;
  15.   int otherinfo;
  16. }RedType;
  17. typedef struct{
  18.   RedType r[MAXSIZE+1];
  19.   int length;
  20. }SqList,*Seq;
  21. void Print(SqList L,int x)
  22. {  int i;
  23.    
  24.    printf("第%d趟排序结果为:",x);
  25.    for(i=1;i<9;i++)
  26.     printf("%d ",L.r[i].key);
  27.    puts("n");
  28. }
  29. //1
  30. /*void Insert(SqList L)// 对顺序表 L 作直接插入排序
  31.   int i,j;
  32.   
  33.   for(i=2;i<=L.length;++i)
  34.   {
  35.   if(L.r[i].key<L.r[i-1].key)
  36.   {
  37.     L.r[0]=L.r[i];// 复制为监视哨
  38. for(j=i-1;L.r[0].key<L.r[j].key;--j)
  39. L.r[j+1]=L.r[j];// 记录后移
  40. L.r[j+1]=L.r[0];// 插入到正确位置
  41.   }
  42.       Print(L,i-1);
  43.   }
  44.   printf(" 排序结束!n");
  45. }
  46. //2
  47. Seq ShellInsert ( Seq s, int dk )//希尔排序
  48. {
  49.    int i,j;
  50.    for ( i=dk+1; i<=s.length; ++i )
  51.    {
  52.       if ( s.r[i].key< s.r[i-dk].key)
  53.   {
  54.         s.r[0] = s.r[i];            // 暂存在R[0]
  55.         for (j=i-dk;j>0&&(s.r[0].key<s.r[j].key);j-=dk)
  56.            s.r[j+dk] = s.r[j];  // 记录后移,查找插入位置
  57.         s.r[j+dk] = s.r[0];                // 插入
  58.   } // if
  59.    }
  60.    return s;
  61. } // ShellInsert
  62. void ShellSort (SqList  L)
  63. {   
  64. Seq l;
  65. int dlta[2]={3,1}; //增量为dlta[]的希尔排序
  66.     int k;
  67. l=&L;
  68.     for (k=0; k<2; ++k)
  69. {
  70.          l=ShellInsert(l, dlta[k]);//一趟增量为dlta[k]的插入排序
  71.  Print(L,k+1);
  72. }
  73. printf(" 排序结束!n");
  74. } // ShellSort
  75. //3
  76. void BubbleSort(SqList L)//冒泡排序
  77. {
  78.    int i=9,lastExc,j;
  79.    RedType x;
  80.    while (i >1) 
  81.    { 
  82.      lastExc = 1;
  83.      for (j = 1;  j < i;  j++)
  84.  {
  85.        if (L.r[j+1].key < L.r[j].key) 
  86.    { 
  87.           x=L.r[j+1];//Swap
  88.   L.r[j+1]=L.r[j];
  89.   L.r[j]=x;
  90.           lastExc = j;  //记下进行交换的记录位置
  91.    } //if
  92.    Print(L,j);
  93.  }
  94.  i = lastExc; 
  95.    } // while
  96.    printf(" 排序结束!n");
  97. } // BubbleSort
  98. //4
  99. int Partition (Seq l, int low, int high)//快速排序
  100. {
  101. int pivotkey;
  102.     l->r[0] = l->r[low]; 
  103. pivotkey = l->r[low].key;  // 枢轴  
  104.     while (low<high) 
  105. {
  106.        while(low<high&& l->r[high].key>=pivotkey)
  107.           -- high;      // 从右向左搜索
  108.        l->r[low] = l->r[high];
  109.        while (low<high && l->r[low].key<=pivotkey) 
  110.           ++ low;      // 从左向右搜索
  111.        l->r[high] = l->r[low];
  112. }
  113.     l->r[low] = l->r[0];    
  114. return low;
  115. }// Partition         
  116. void QSort (SqList L,  int s,  int  t ,int i) // 对记录序列r[s..t]进行快速排序
  117. {
  118.   Seq l;
  119.   int pivotloc;
  120.   
  121.   l=&L;
  122.   if (s < t) // 长度大于1
  123.   {             
  124.     pivotloc = Partition(l, s, t); // 对 R[s..t] 进行一次划分
  125.     QSort(L, s, pivotloc-1,i);
  126. Print(L,i++);
  127.     QSort(L, pivotloc+1, t,i); 
  128.   }
  129. } // QSort
  130. //5
  131. void Select(SqList L) // 对记录序列R[1..n]作简单选择排序
  132.   int i,j,k=1;
  133.   RedType s;
  134.    
  135.   for (i=1; i<8; ++i)
  136.   { 
  137.   for(j=i+1;j<=8;j++)
  138.      if(L.r[j].key<L.r[j-1].key)  k=j;// 在 R[i..n] 中选择关键字最小的记录
  139.       if(i!=k)            // R[i]←→R[k]; 与第 i 个记录交换
  140.   {
  141.      s=L.r[i];
  142.  L.r[i]=L.r[k];  
  143.  L.r[k]=s;
  144.   }
  145.   Print(L,i);
  146.   }
  147. } // Select
  148. //6
  149. void HeapAdjust (Seq l, int s, int m)//建大顶堆
  150. {   
  151.   RedType rc;
  152.   rc = l->r[s];    // 暂存 R[s] 
  153.   for ( j=2*s; j<=m; j*=2 )
  154.   { // j 初值指向左孩子
  155.     if ( j<m && l->r[j].key<l->r[j+1].key )  ++j;     
  156.     if ( rc.key >= l->r[j].key )  break; 
  157.     l->r[s] = l->r[j];  
  158. s = j;    
  159.   }
  160.   l->r[s]=rc; // 将调整前的堆顶记录插入到 s 位置
  161. } // HeapAdjust
  162. void HeapSort ( SqList L)// 对顺序表 L进行堆排序
  163. {
  164.   int i,j=1;
  165.   Seq l;
  166.   SqList s;
  167.   for ( i=L.length/2;   i>0;   --i )
  168.      HeapAdjust ( l, i, L.length );    // 建大顶堆
  169.   for ( i=L.length; i>1; --i ) 
  170.   {
  171.      s=L.r[i];// H.r[1]←→H.r[i];
  172.  L.r[i]=L.r[1];
  173.  L.r[1]=s;
  174.  Print(L,j++);
  175.      HeapAdjust(l, 1, i-1);  // 对 H.r[1] 进行筛选
  176.   }
  177. } // HeapSort*/
  178.  
  179. //7归并排序
  180. void Merge (RedType SR[], RedType TR[],int i, int m, int n) 
  181. {// 将有序的记录序列 SR[i..m] 和 SR[m+1..n]归并为有序的记录序列 TR[i..n]
  182.   int k,j;
  183.   for (j=m+1, k=i;  i<=m && j<=n;  ++k)   
  184.   {                   // 将SR中记录由小到大地并入TR
  185.     if (SR[i].key<SR[j].key)  TR[k] = SR[i++];
  186.     else TR[k] = SR[j++];
  187.   }
  188.   if (i<=m) TR[k++] = SR[i++];// 将剩余的 SR[i..m] 复制到 TR
  189.   if (j<=n) TR[k++] = SR[j++];// 将剩余的 SR[j..n] 复制到 TR
  190. } // Merge
  191. void Msort ( RedType SR[],RedType TR1[], int s, int t /*,SqList S,int i*/) 
  192. {// 将SR[s..t] 归并排序为 TR1[s..t]
  193. int m,i;
  194.     if(s==t)   TR1[s]=SR[s];
  195.     else 
  196.       {
  197.        m = (s+t)/2;
  198.        Msort (SR,TR1,s,m); // 递归地将SR[s..m]归并为有序的TR2[s..m]
  199.        Msort (SR,TR1,m+1,t);
  200.        Merge (SR,TR1,s,m,t);
  201.    for(i=1;i<9;i++)
  202.          printf("%d ",TR1[i].key);
  203.        puts("n");
  204.   // Print(S,i++);
  205.       }
  206. } // Msort
  207. void MergeSort (SqList L) 
  208. {// 对顺序表 L 作2-路归并排序
  209.   SqList S;
  210.   int i=1,j;
  211.   for(j=1;j<9;j++)  S.r[j].key=0;//L.r[j].key;
  212.   Msort(L.r, S.r,1, L.length);
  213. } // MergeSort
  214. //k={ 12 , 45 , 21 , 12 , 30 , 2 , 68 , 33 }
  215. void main()
  216. {
  217. int quick[9];
  218.     int i;
  219. SqList L;
  220. /* SqList s;//辅助顺序存储数组
  221. Seq  l;*/
  222. printf("请输入8个整数:");
  223. for(i=1;i<9;i++)    scanf("%d",&quick[i]);
  224. printf("n输入的8个整数为:n");
  225. for(i=1;i<9;i++)
  226. {
  227.   L.r[i].key=quick[i];
  228.       printf("%d ",quick[i]);
  229. }
  230. puts("n");
  231. L.length=i-1;
  232. // Insert(L);
  233.    // QSort(L,1,8,1);
  234.     MergeSort (L) ;
  235. }