C/C++ 排序算法代码综合

时间:2021-11-22 04:08:48

#include <cstdio>
#define MAXSIZE 20
using namespace std;

typedef struct
{ int r[MAXSIZE+1];
  int length;
}List;

/* 初始化 */
void Initial(List &L,int num[],int n)
{ for(int i=0;i<n;i++)
    L.r[i]=num[i];
  L.length=n-1;
}

/* 输出结果 */
void Print(List L)
{ for(int i=1;i<=L.length;i++)
    printf("%d ",L.r[i]);
  printf("/n");
}

/* 直接插入排序 */
void InsertSort(List &L)
{
 int i;
 int j;
 for(i=2;i<=L.length;i++)
 {
       if(L.r[i]<L.r[i-1])
    {
     L.r[0]=L.r[i]; //设置哨兵,防止下标越界
        for(j=i-1; (L.r[j]>L.r[0]); j--)     //寻找插入位置
     {
      L.r[j+1]=L.r[j];              //记录后移
        }
           L.r[j+1]=L.r[0];
     }
 }
 
}/* 直接插入排序 */

/* 希尔排序 */
void ShellInsert(List &L,int dk)
{
  for(int i=dk+1;i<=L.length;i++)
  {
  int j;
     if(L.r[i]<L.r[i-dk])
    { L.r[0]=L.r[i];
      for( j=i-dk;(j>0) && (L.r[0]<L.r[j]);j-=dk)
     {
           L.r[j+dk]=L.r[j];
      }
       L.r[j+dk]=L.r[0];
  }
   }
}

void ShellSort(List &L,int dlta[],int t)
{ for(int k=0;k<t;k++)
    ShellInsert(L,dlta[k]);
}/* 希尔排序 */

/* 冒泡排序 */
void BubbleSort(List &L)
{ int t;
  bool change=true;
  for(int i=L.length;change && i>1;i--)
  { change=false;
    for(int j=1;j<i;j++)
      if(L.r[j]>L.r[j+1])
        {t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;change=true;}
  }
}/* 冒泡排序 */

/* 快速排序 */
int Partition(List &L,int low,int high)
{ L.r[0]=L.r[low];
  while(low<high)
  { while(low<high && L.r[high]>=L.r[0]) high--;
    L.r[low]=L.r[high];
    while(low<high && L.r[low]<=L.r[0]) low++;
    L.r[high]=L.r[low];
  }
  L.r[low]=L.r[0];
  return low;
}

void QuickSort(List &L,int low,int high)
{ if(low<high)
  { int piv;
    piv=Partition(L,low,high);
    QuickSort(L,low,piv-1);
    QuickSort(L,piv+1,high);
  }
}/* 快速排序 */

/* 选择排序 */
void SelectSort(List &L)
{ int t;
  for(int i=1;i<L.length;i++)
  { int k=i;
    for(int j=i+1;j<=L.length;j++)
      if(L.r[k]>L.r[j]) k=j;
    if(k!=i){t=L.r[i];L.r[i]=L.r[k];L.r[k]=t;}
  }
}/* 选择排序 */

/* 堆排序 */
void HeapAdjust(List &L,int s,int m)
{ int rc=L.r[s];
  for(int i=2*s;i<=m;i=2*s)
  { if(i+1<=m && L.r[i]<L.r[i+1]) i++;
    if(rc>=L.r[i]) break;
    L.r[s]=L.r[i];
    s=i;
  }
  L.r[s]=rc;
}

void HeapSort(List &L)
{ int i,t;
  for(i=L.length/2;i>0;i--)
    HeapAdjust(L,i,L.length);
  for(i=L.length;i>1;i--)
  { t=L.r[1];L.r[1]=L.r[i];L.r[i]=t;
    HeapAdjust(L,1,i-1);
  }
}/* 堆排序 */

/* 归并排序 */
void Merge(List L,List &T,int l,int m,int h)
{ int i=l,j=m+1,k=l;
  while(i<=m && j<=h)
    if(L.r[i]<=L.r[j]) T.r[k++]=L.r[i++];
    else T.r[k++]=L.r[j++];
  while(i<=m) T.r[k++]=L.r[i++]; //原来if改为while
  while(j<=h) T.r[k++]=L.r[j++]; //原来if改为while
}

void MergeSort(List L,List &T,int s,int t)
{ if(s==t) T.r[s]=L.r[s];
  else
  { int m=(s+t)/2;
    List S;
    MergeSort(L,S,s,m);
    MergeSort(L,S,m+1,t);
    Merge(S,T,s,m,t);
  }
}/* 归并排序 */

/* 主函数 */
void main()
{
  List L;
  int num[9]={0,49,38,65,97,76,13,27,49};
  int dlta[3]={5,3,1};
  Initial(L,num,9);
  printf("原来的数据为:");
  Print(L);
  Initial(L,num,9);
  printf("直接插入排序:");
  InsertSort(L);
  Print(L);
  Initial(L,num,9);
  printf("希尔排序 :");
  ShellSort(L,dlta,3);
  Print(L);
  Initial(L,num,9);
  printf("冒泡排序 :");
  BubbleSort(L);
  Print(L);
  Initial(L,num,9);
  printf("快速排序 :");
  QuickSort(L,1,L.length);
  Print(L);
  Initial(L,num,9);
  printf("选择排序 :");
  SelectSort(L);
  Print(L);
  Initial(L,num,9);
  printf("堆排序 :");
  HeapSort(L);
  Print(L);
  Initial(L,num,9);
  printf("归并排序 :");
  MergeSort(L,L,1,L.length);
  Print(L);
}