在我们的日常生活中,很多地方都会直接或者间接的使用排序这种操作,比如中午去学校食堂买饭的时候需要排队,将同学的的资料按学号排列等等,排序与我们的生活息息相关。
在计算机语言中,很多时候我们对一些数据进行处理的时候,也会用到排序,特别是处理大数据的时候,经常会用到一些排序的算法,下面就来介绍一些常用的算法吧。
这里我们默认所有排序都是升序排序。
插入排序
**插入排序的思想是将一组数据的每一个元素,从后往前找比自己大的元素,并将这些元素移到自己的后面,直至找到第一个小于自己的元素,找到后将自己插入到该元素的后面,以此类推,直至遍历完所有元素。**代码如下:
void InsertSort(int *arr, int len)
{
int i;
int j;
int tmp = 0;
for (i = 1; i <len; i++)
{
tmp = arr[i];
for (j = i-1; j >= 0; j--)
{
if (arr[j] <= tmp)
{
break;
}
else
{
arr[j + 1] = arr[j];
}
}
arr[j + 1] = tmp;
}
}
从插入排序算法的思想来看,当一组数据越来越趋向有序时,插入排序的速度也就越来越快,简单来说就是越有序速度越快。
shell(希尔)排序
shell排序是在插入排序的基础上得出的,与插入排序不同的是shell排序是将一组数据等距划分成了若干组,具体划分方法如下图,同时每一次都减少分组数量,直至分组数为1,使得数据越来越有序的过程。
代码如下:
//一次Shell排序
void Shell(int *arr, int len,int gap)
{
int i;
int j;
int tmp;
for (i = gap; i <len; i++)
{
tmp = arr[i];
for (j = i - gap; j >= 0; j-=gap)
{
if (arr[j] <= tmp)
{
break;
}
else
{
arr[j + gap] = arr[j];
}
}
arr[j + gap] = tmp;
}
}
//Shell排序
void ShellSort(int *arr, int len)
{
int brr[] = { 5, 3, 1 };
for (int i = 0; i <sizeof(brr) / sizeof(brr[0]) ; i++)
{
Shell(arr, len, brr[i]);
}
}