1.插入排序法
什么是插入排序法呢?
通俗来说就是拿出一个数组中的元素,放在第一为,随后拿出第二个元素与第一个元素相比较,如果比第一个小则插在之前,如果比第一大插在之后,依次进行。
书本定义,插入法其基本原理就是抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直至完成排序。
| 元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 | ||
| 初始值 | 8 | 12 | 3 | 21 | 10 | |
| 第1次排序 | 8 | |||||
| 第2次排序 | 8 | 12 | ||||
| 第3次排序 | 3 | 8 | 12 | |||
| 第4次排序 | 3 | 8 | 12 | 21 | ||
| 排序结果 | 3 | 8 | 10 | 12 | 21 | 
注意:每次拿出来的数都与表格中最前面(也就是最小)的元素相比较,判断插入的位置。
代码实现:
#include <stdio.h>
int main()
{
  int i, j = 0;
  int temp,count = 0;
  int arr[5];
  printf("为数组元素赋值:\n");
  for (i = 0; i < 5; i++)
  {
    printf("arr[%d]=", i);
    scanf("%d", &arr[i]);
  }
  for (i = 1; i < 5; i++)
  {
    temp = arr[i];
    count =i- 1;
    while (count >= 0 && arr[count] > temp)
    {
      arr[count + 1] = arr[count];
      count--;
    }
    arr[count + 1] = temp;
  }
  
  for (i = 0; i < 5; i++)
  {
    printf("%d\t", arr[i]);
    if (2 == i)
    {
      printf("\n");
    }
  }
  return 0;
}注:设计核心是,设置一个嵌套循环,第一层循环主要的任务是:将第二个元素的值赋给中间变量,并记录前一个元素的下标位置。第二层循环的主要任务是:记录的元素的下标位置必须要大于等于第一个元素的下标位置,并且中间变量的值小于设置下标位置的元素,如果满足将当前设置下标的元素值赋给当前的数组元素,然后将下标向前移动一位。
程序运行结果:
2.折半排序法
什么是折半排序法呢?
折半排序又称快速排序,其核心就是选择一个中间值,然后把比中间值小的数据放左边,比中间值大的数据放在右边,然后依次进行排序
| 元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 | ||
| 初始值 | 9 | 6 | 15 | 4 | 2 | |
| 第1次排序 | 9 | 6 | 2 | 4 | 15 | |
| 第2次排序 | 4 | 6 | 2 | 9 | 15 | |
| 第3次排序 | 4 | 2 | 6 | 9 | 15 | |
| 第4次排序 | 2 | 4 | 6 | 9 | 15 | |
| 排序结果 | 2 | 4 | 6 | 9 | 15 | 
代码实现:
#include <stdio.h>
void CelerityRun(int left, int right, int arr[])
{
  int i, j = 0;
  int mid, temp = 0;
  i = left;
  j = right;
  mid = arr[(left + right) / 2];
  do
  {
    while ((arr[i] < mid) && (i < right))   //从左边寻找小于中值的数
    {
      i++;
    }
    while ((arr[j]>mid) && (j > left))      //从右边寻找小于中值的数
    {
      j--;
    }
    if (i <= j)
    {
      temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
      i++;
      j--;
    }
  } while (i <= j);                   //如果两边的下标交错,就停止(完成一次循环)
  //递归左半边
  if (left < j)
  {
    CelerityRun(left, j, arr);
  }
  //递归右半边 
  if (right > i)
  {
    CelerityRun(i, right ,arr);
  }
}
int main()
{
  int i = 0;
  int arr[5];
  printf("为数组元素赋值:\n");
  for (i = 0; i < 5; i++)
  {
    printf("arr[%d]=", i);
    scanf("%d", &arr[i]);
  }
  CelerityRun(0, 4, arr);
  for (i = 0; i < 5; i++)
  {
    printf("%d\t", arr[i]);
    if (2 == i)
    {
      printf("\n");
    }
  }
  return 0;
}程序运行结果:











