本章涉及三个排序算法。冒泡排序 、插入排序、合并排序(默认从小到大排)。
1、冒泡排序
是一种较流行的算法。重复交换相邻的反序元素,每一趟冒泡排序后,最大(最小)都被排在n,下一趟再从0到n-1,经过n趟,元素排列完毕。算法复杂度为O(n2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>

const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;

void INIT() {
  int i;
  scanf("%d ",&size);
  for(i = 0; i < size; i++)
  {
    scanf("%d ",&test[i]);
  }
  return;
}
void BUBBLE_SORT()
{
  int i,j,tmp;
  for(i = 0; i < size; i++)
  {
    for(j = 1; j < size-i; j++)
    {
      if(test[j] < test[j-1])
      {
        tmp = test[j-1];
        test[j-1] = test[j];
        test[j] = tmp;
      }
    }
  }
  return;

}

void PRINTF()
{
  int i;
  for(i = 0; i < size; i++)
  {
    printf("%d ",test[i]);
  }
  return;
}

void main ()
{
  freopen("input.txt","r",stdin);
  INIT();
  BUBBLE_SORT();
  PRINTF();  
}

2、插入排序
类似打扑克抓牌是,从1到n开始将牌从一边依次寻找比它小(大),插入该位置,之后的元素都往后移一位。算法复杂度为O(n2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>

const int MAX_SIZE = 0xFFFFFF;
int test[MAX_SIZE];
int size;

void INIT() {
  int i;
  scanf("%d ",&size);
  for(i = 0; i < size; i++)
  {
    scanf("%d ",&test[i]);
  }
  return;
}
void INSERTION_SORT()
{
  int i,j,key;
  for(j = 1; j < size; j++)
  {
    key = test[j];
    i = j-1;
    while(i >=0 && test[i] > key)
    {
      test[i+1] = test[i];
      i--;
    }
    test[i+1] = key;
  }
  return;

}

void PRINTF()
{
  int i;
  for(i = 0; i < size; i++)
  {
    printf("%d ",test[i]);
  }
  return;
}

void main ()
{
  freopen("input.txt","r",stdin);
  INIT();
  INSERTION_SORT();
  PRINTF();  
}

3、合并排序
采用分治的策略,将规模为n的待排元素一直二分,分到每堆有2个元素(n为奇数,有一堆为1个元素),然后取每两堆堆元素进行排序到一堆,一直合并到剩一堆。算法复杂度为O(n*logn),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h>

const int INF = 0xFFFFFF;
const int MAX_SIZE = 0xFFFF;
int test[MAX_SIZE];
int left[MAX_SIZE/2 + 1],right[MAX_SIZE/2 + 1];
int size;

void INIT() {
  int i;
  scanf("%d ",&size);
  for(i = 0; i < size; i++)
  {
    scanf("%d ",&test[i]);
  }
  return;
}

void MERGE(int p, int q, int r)
{
  int i,j,k,n1,n2;
  n1 = q-p+1;
  n2 = r-q;
  for(i = 0; i < n1; i++)
  {
    left[i] = test[p+i];
  }
  for(j = 0; j < n2; j++)
  {
    right[j] = test[q+j+1];
  }
  left[n1] = INF; // 设置哨兵元素
  right[n2] = INF;
  i = 0;
  j = 0;
  for(k = p; k <= r; k++)
  {
    if(left[i] <= right[j])
    {
      test[k] = left[i];
      i++;
    }
    else
    {
      test[k] = right[j];
      j++;
    }
  }
  return ;
}

void MERGE_SORT(int p,int r)
{
  int q;
  if(p < r)
  {
    q = (p+r)/2;
    MERGE_SORT(p,q);
    MERGE_SORT(q+1,r);
    MERGE(p,q,r);
  }
  return;

}

void PRINTF()
{
  int i;
  for(i = 0; i < size; i++)
  {
    printf("%d ",test[i]);
  }
  return;
}

void main ()
{
  freopen("input.txt","r",stdin);
  INIT();
  MERGE_SORT(0,size-1);
  PRINTF();  
}