一、插入类排序
1、直接插入排序:适合数据较小且数据较有序的数字序列。
算法思想:将一个数组先划分成已排序好的部分和未排序好的部分,从未排序好的部分中获取一个关键数作为待排序数,在
已
排
好序的序列中找到合适位置插入这个数据。需要一个中间变量tmp存放每次获取的关键数。
程序代码如下:
void insertSort(int arr[], int len)
{
int i, j;
for (i = 2; i < len; ++i)
{
arr[0] = arr[i];
for (j = i - 1; arr[j] > arr[0]; --j)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = arr[0];
}
}
{
int i, j;
for (i = 2; i < len; ++i)
{
arr[0] = arr[i];
for (j = i - 1; arr[j] > arr[0]; --j)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = arr[0];
}
}
2、希尔排序:又称缩小增量排序法
算法思想:给一个增量组合,通常给{5,3,1}
,
即下面代码中的dka[];根据增量组合将待排序的关键字序列分成相应的若干
较小子序列,对子序列进行直接插入排序,使整个待排序列排好序。
程序代码如下:
void shell(int arr[], int arr_len,int dk)
{
int i, j;
int tmp;
for (i = dk; i < arr_len; ++i)
{
tmp = arr[i];
for (j = i - dk; j >= 0 && arr[j] > tmp; j = j - dk)
{
arr[j + dk] = arr[j];
}
arr[j + dk] = tmp;
}
}
{
int i, j;
int tmp;
for (i = dk; i < arr_len; ++i)
{
tmp = arr[i];
for (j = i - dk; j >= 0 && arr[j] > tmp; j = j - dk)
{
arr[j + dk] = arr[j];
}
arr[j + dk] = tmp;
}
}
void shellSort(int arr[], int arr_len, int dka[], int dka_len)
{
for (int i = 0; i < dka_len; ++i)
{
shell(arr,arr_len,dka[i]);
}
}