排序算法
// copyright by hwdong
插入排序、折半插入排序
#include <stdio.h>
typedef int T;
/*插入排序*/
void InsertSort(T r[],int n) {
  for(int i = 1; i <n; i ++)
     if(r[i]<r[i-1]) {
        T temp = r[i];        /*r[i]保存起来*/
        r[i] = r[i-1];    /*r[i-1]后移一个单元*/
       //从i-2开始,往左扫描,直到找到一个<=temp的j
       int j;
       for(j=i-2; j>=0&&temp<r[j]; j--)
          r[j+1] = r[j];       /*每个元素后移*/
       r[j+1] = temp;    /*最后把r[0]写入*/
     }   
}
/*折半插入排序*/
void BiInsertSort(T R[],int n) {
/* 对序列R[0],...R[n-1]作折半插入排序 */
 T temp; int low,high,m;
 for(int i=1; i<n; ++i ) {
     temp = R[i];   /* 将R[i]暂存到R[0]*/
     low = 0; high = i-1;
     while(low<=high) { 
       /*在R[low..high]中折半查找插入的位置*/
         m = (low+high)/2; /* 折半 */
         if (temp < R[m])
              high = m-1; /* 插入点在低半区*/
         else low = m+1;  /* 插入点在高半区*/ 
     }
     for(int j=i-1; j>=high+1; --j )
        R[j+1] = R[j]; /* 记录后移 */
     R[high+1] = temp; /* 插入 */
  }
}
void Print(T a[],int n){
  for(int i = 0 ; i<n;i++)
    printf("%d ",a[i]);
  printf("\n");
}
int main(){
  T arr[] = {49,38,65,97,76,13,27};
  BiInsertSort(arr,7);
  Print(arr,7);
  T b[] = {49,38,65,97,76,13,27};
  InsertSort(b,7);
  Print(arr,7);
}
希尔排序
#include <stdio.h>
typedef int EType;
int LT(EType a, EType b){
  if(a<b) return 1;
  return 0;
}
/*只要对插入排序稍作修改,使得间隔为d的属于
 一个子序列进行插入就可以了*/
 
void InsertShellPass(EType a[], int n,int d) {
  int i,j; EType t;
  for(i = d; i < n; i ++)
    if(LT(a[i], a[i-d])){    //i比i-d小
      t = a[i];    //用t先保存a[i]的值
      a[i] = a[i-d];   //a[i-d]后移一个单元
    
      //从i-2*d开始,往左扫描,直到找到一个<=t的
      for(j=i-2*d; j>=0&<(t,a[j]); j-=d)
        a[j+d] = a[j];       //每个元素后移
      a[j+d] = t;    //最后把t写入j+1位置
  }
}
 void ShellSort(EType a[],int n){
    int ds[] = {7,5,3,1};
    for(int i = 0 ; i<4;i++)
      InsertShellPass(a,n,ds[i]);
 }
void Print(EType a[],int n){
  for(int i = 0 ; i<n;i++)
    printf("%d ",a[i]);
  printf("\n");
}
int main(){
  EType arr[] = {49,38,65,97,76,13,27};
  
  ShellSort(arr,7);
  Print(arr,7);
}
冒泡排序Bubble sort
/* Bubble sort */
#include <stdio.h>
typedef int T;
void swap(T *xp, T *yp)
{
    T temp = *xp;
    *xp = *yp;
    *yp = temp;
}
/*
void bubbleSort(T arr[], int n){
   int i, j;
   for (i = n-1; i>0; i--)         
       for (j = 0; j < i; j++) 
           if (arr[j] > arr[j+1])
              swap(&arr[j], &arr[j+1]);
}
*/
void bubbleSort(T a[], int n){
   int i, j,swaped;
   for(i = n-1; i>0; i--){
       swaped = 0;         
       for(j = 0; j < i; j++) 
          if (a[j] > a[j+1]){
              swap(&a[j], &a[j+1]);
              swaped = 1;
          }
       if(swaped) break;
   }
}
/* Function to print an array */
void printArray(T arr[], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
/*test above functions*/
int main()
{
    T arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}
快速排序
#include <stdio.h>
typedef int EType;
int LT(EType a, EType b){
  if(a<b) return 1;
  return 0;
}
void Swap(EType *a, EType *b){
  EType t = *a; *a = *b; *b = t;
}
int Partition(EType data[], int low, int high){
      int pivot      = low;       // 以最左元素为中轴
      EType pivotvalue = data[low]; // 记录中轴的值
      while(low < high) {
          while(low<high && data[high] >= pivotvalue)
              high --; // high向左,直到遇见比pivot小的
          while(low<high && data[low] <= pivotvalue)
              low ++;  // low向右,直到遇见比pivot大的
          // low和high扫描受阻,交换low和high的值
          Swap(&data[low], &data[high]);
      }
      // 交换中轴和low的值(也就是把中轴放置到正确的位置上)
      Swap(&data[pivot], &data[low]);
      return low;
  }
void QSort(EType a[], int low, int high) {
    if(low < high)  {    //待排序数列长度大于1
        int pivotloc = Partition(a, low, high);   
        //对左子序列进行排序
        QSort(a, low, pivotloc - 1);
        //对右子序列进行排序
        QSort(a, pivotloc + 1, high);         
    }
}
void Print(EType a[],int n){
   for(int i = 0 ; i<n;i++)
    printf("%d\t",a[i]);
   printf("\n");
}
int main(){
  EType arr[] = {49,38,65,97,76,13,27};
  Print(arr,7);
  QSort(arr,0,6);
  Print(arr,7);
}
选择排序
#include <stdio.h>
typedef int EType;
int LT(EType a, EType b){
  if(a<b) return 1;
  return 0;
}
void Swap(EType *a, EType *b){
  EType t = *a; *a = *b; *b = t;
}
void SelectSort(EType data[], int n) {
    for(int i = 0; i < n; i ++) {
  // 找到i~n-1中最小的一个IndexMin
     int IndexMin = i;
     for(int j = i; j < n; j ++)
        if(LT(data[j], data[IndexMin]))
           IndexMin = j;
           // 把IndexMin和i作交换
     if(IndexMin != i)
        Swap(&data[IndexMin],&data[i]);
  }
}
void Print(EType a[],int n){
   for(int i = 0 ; i<n;i++)
    printf("%d\t",a[i]);
   printf("\n");
}
int main(){
  EType arr[] = {49,38,65,97,76,13,27};
  Print(arr,7);
  SelectSort(arr,7);
  Print(arr,7);
}
归并排序
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef int T;
void copy(T A[], T B[], int s, int n){
  for (int i = s; i <= n; i++)
    B[i] = A[i];
}
void copy(T A[], T B[], int n){
  for (int i = 0; i < n; i++)
    B[i] = A[i];
}
void print(T A[], int n){
  for (int i = 0; i<n; i++)
    printf("%d ", A[i]);
  printf("\n");
}
void merge(T data[], T out[], int s, int M, int N){
  int i = s, j = M + 1, k = s;
  //1.两个序列都还有数据
  while (i <= M && j <= N)
    if (data[i] <= data[j])
      out[k++] = data[i++];
    else
      out[k++] = data[j++];
  //2.序列剩余数据依次写入目标序列
  while (i <= M)
    out[k++] = data[i++];
  while (j <= N)
    out[k++] = data[j++];
}
/*------自顶向下的递归归并-------*/
/*[s,t]区间: A归并排序到B中 */
void TopDownMergeSort(T A[], T B[], int s, int t){
  if (t == s) {
    B[s] = A[s]; return;
  }
  TopDownMergeSort(A, B, s, (s + t) / 2);      /*[s,(s + t) / 2]区间: A归并排序到B中 */
  TopDownMergeSort(A, B, (s + t) / 2 + 1, t);  /*[(s + t) / 2 + 1, t) / 2]区间: A归并排序到B中 */
  merge(B, A, s, (s + t) / 2, t);       /*B中2个有序序列的一趟归并到A中*/
  copy(A, B, s, t);                     /* 将数组A拷贝到B 中 */
}
/*------自底向上的迭代归并-------*/
inline T min(T a, T b){ return a < b ? a : b; }
void BottomUpMergeSort(T A[], T B[], int n){
  for (int width = 1; width < n; width = 2 * width) {
    /*A由宽度为width的有序序列构成(最后一个可能宽度小于width)*/
    for (int i = 0; i < n; i = i + 2 * width)
    {
      /* 将2个有序序列A[i:i+width-1] and A[i+width:i+2*width-1] 归并到 B[] */    
      merge(A, B, i, min(i + width, n)-1, min(i + 2 * width, n)-1);
    }   
    copy(B, A, n); /* 现在A由长度为2*width的有序序列构成*/
  }
}
int main(){
  T A[] = { 64, 34, 25, 12, 22, 11, 90 };
  /* 和A同样大小的辅助数组 */
  T *B = (T*)malloc(7 * sizeof(T));
  print(A, 7);
  /*自顶向下的递归归并*/ 
  TopDownMergeSort(A, B, 0, 6);    
  /*自底向上的迭代归并*/ 
  /*BottomUpMergeSort(A, B, 7);*/  
  print(B, 7);
}
堆排序
- C版本
```c
#include 
 
/*
- 把原始数据整理成最大堆 i = n/2 to 1 调整第i个元素[i,n]
 - 不断输出调整 2.1)输出堆顶元素 2.2)调整新堆顶元素 */
 
typedef int T;
void heap_adjust(T a[], int s, int m){ T t = a[s]; int j = 2*s; for(; j <= m; j *= 2) { if(j < m && a[j]< a[j+1] ) j++; //j指向s较大的“儿子” if(!(t<a[j]) ) break; //若j的值比t小,说明找到了s的位置 a[s] = a[j]; //否则元素j上移 s = j; } a[s] = t; //写入s }
void heap_sort(T a[],int n){ for(int i = n/2; i>=1; i–) heap_adjust(a,i,n);
for(int i = n; i>=2; ){ T t = a[1];a[1] = a[i]; a[i] = t; heap_adjust(a,1,–i); } }
int main() { T a[] = {-1,7,3,1,5,4,8,2}; heap_sort(a,7); for(int i = 1; i<=7;i++) printf(“%d\n”, a[i]); }
* C++(引用)版本
```cpp
//---------sort.h-------
#define MAXSIZE 1024     // 最多元素个数
typedef double KeyType;   // 关键字类型
typedef char InfoType;
typedef struct{
  KeyType key;       // 关键字
  InfoType otherinfo;
}RedType;              // 一条数据记录
typedef struct{
  RedType r[MAXSIZE+1]; // 数组
  int length;           // 元素个数
}SqList;    
bool LT(KeyType k1,KeyType k2) {return k1<k2;}
void swap(RedType &r1, RedType &r2){ RedType t = r1; r1 = r2; r2 = t;}
//---------------------insert sort----------------
void InsertSort(SqList &L) {
  for(int i = 2; i <= L.length; i ++)
    if(LT(L.r[i].key, L.r[i-1].key)) //i比i-1小
    
    {
      L.r[0] = L.r[i];      //用r[0]先记录r[i]的值
      L.r[i] = L.r[i-1];    //r[i-1]后移一个单元
      //从i-2开始,往左扫描,直到找到一个<=r[0]的j
      int j;
      for(j=i-2; LT(L.r[0].key, L.r[j].key); j--)
        L.r[j+1] = L.r[j];       //每个元素后移
      L.r[j+1] = L.r[0];    //最后把r[0]写入
    }
}
//---------heap sort----------------
void HeapAdjust(SqList &H, int s, int m) {
  RedType rc = H.r[s]; //暂时保存待下移的数据
  for(int j = 2 * s; j <= m; j *= 2) {
    if(j < m && LT(H.r[j].key, H.r[j+1].key))
      j ++;    //j指向s较大的“儿子”
    if(!LT(rc.key,H.r[j].key))
      break;  //若j的值比rc小,说明找到了s的位置
    H.r[s] = H.r[j]; //否则元素j上移
    s = j;
  }
  H.r[s] = rc;   //写入s
}
void HeapSort(SqList &H){
   //将H.r[1…H.length()]建成大顶堆
   for(int i = H.length /2;i>0;i--)
     HeapAdjust(H, i, H.length);
   //输出堆顶H.r[1],并调整H.r[1…i-1]
   for(int i = H.length;i>1;i--){
     swap(H.r[1], H.r[i]); //两者交换
     HeapAdjust(H,1,i-1);
   }
}
//------------------main.cpp---------------
#include <stdio.h>
void OutPut(const SqList &sL){
  for(int i = 1; i<=sL.length;i++){
    printf("%8.2f  ",sL.r[i]);
  }
  printf("\n");
}
//#define TIME_TEST
#ifdef TIME_TEST
#include <time.h>
#endif
int main(){
#ifdef TIME_TEST
  time_t   start, finish;
  double   elapsed_time;
#endif
  SqList sL;
  RedType r; 
  r.otherinfo = 'A';
  sL.length = 0;
  r.key = 36;  sL.r[++sL.length] = r; 
  r.key = 16;  sL.r[++sL.length] = r; 
  r.key = 26;  sL.r[++sL.length] = r; 
  r.key = 66;  sL.r[++sL.length] = r; 
  r.key = 296; sL.r[++sL.length] = r; 
  r.key = 106; sL.r[++sL.length] = r; 
  r.key = 56;  sL.r[++sL.length] = r; 
  
  SqList tL = sL;
  OutPut(tL);
#ifdef TIME_TEST
  time( &start );
#endif
  InsertSort(tL);
#ifdef TIME_TEST
  time( &finish );
  elapsed_time = difftime( finish, start );
  printf( "InsertSort takes %6.0f seconds.\n", elapsed_time );
#endif
  OutPut(tL);
  
  tL = sL;
  OutPut(tL);
#ifdef TIME_TEST
  time( &start );
#endif
  HeapSort(sL);
#ifdef TIME_TEST
  time( &finish );
  elapsed_time = difftime( finish, start ); 
  printf( "HeapSort takes %6.0f seconds.\n", elapsed_time );
#endif
  OutPut(tL);
    
  return 0;
}
您的打赏是对我最大的鼓励!
支付宝打赏 
微信打赏