一、插入排序
(一)直接插入排序
1.向一组有序的数据中插入一个数;
2.默认第一个数据有序,将第一个数据以后的所有数据视为待排序数据,从待排序的数据中依次选取一个数据,对有序的数据从后向前遍历,直到找到第一个比要插入的数据小的数据,将该数后面的数据均向后移动一位,,将要插入的数据放在该数的后面,形成新的有序数列。直至将所有的数据均插入到数组中,则排序完成。代码如下:
#include <stdio.h>
int main()
{
int arr[] = {14,56,21,19,26,85,67,93,66,34}; //待排序的数组
int i, j, temp, len;
len = sizeof(arr) / sizeof(int); //获得数组中数的个数
for(i = 1; i < len; i++) //插入数据
{
temp = arr[i];
j = i - 1;
while(temp < arr[j] && j >= 0)
{
arr[j + 1] = arr[j];
j--;
}
arr[j+1] = temp;
}
for(i = 0; i < len; i++) //遍历排序后的数组
{
printf("%5d",arr[i]);
}
printf("\n");
return 0;
}
(二)折半插入
折半插入排序是采用折半查找法来寻找插入位置的插入排序方法。
代码如下:
#include <stdio.h>
int main()
{
int arr[] = {14,56,21,19,26,85,67,93,66,34}; //待排序列
int i, j, temp, len, up, low, mid;
len = sizeof(arr) / sizeof(int); //序列长度
for(i = 1; i < len; i++)
{
temp = arr[i];
low = 0;
up = i - 1;
while(low <= up) //查找插入位置
{
mid = (low + up) / 2;
if(temp < arr[mid])
{
up = mid - 1;
}
else
{
low = mid + 1;
}
}
for(j = i;j >= low + 1;j--) //插入点以后的数据均向后移动一位,空出插入位置
{
arr[j] = arr[j - 1];
}
arr[low] = temp; //插入数据
}
for(i = 0; i < len; i++) //遍历排序后的序列
{
printf("%5d",arr[i]);
}
printf("\n");
return 0;
}
(三)希尔排序
1、希尔排序利用了插入排序的简单,同时又避免了插入排序每次只能消除一个逆序对的缺点。希尔排序不是改变相邻元素,而是跳跃一段距离改变。
2、步长也称增量,是希尔排序中最有特色,且重要的概念;
它决定排序的分组,决定算法的优劣程度,与时间复杂度紧密相关;
代码如下:
#include <stdio.h>
void sort(int arr[], int len)
{
int i, j, step, temp;
step = len/2;
while(step >= 1)
{
for(i = step; i < len; i++)
{
temp = arr[i];
j = i-step;
if(arr[j] > temp)
{
arr[i] = arr[j];
arr[j] = temp;
}
}
step = step/2;
}
}
int main()
{
srand((unsigned)time(NULL));
int arr[10] = {0};
int i = 0;
for(i = 0; i < 10; i++)
{
arr[i] = rand() % 100;
}
printf("排序前:\n");
for(i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
putchar(10);
sort(arr, 10);
printf("排序后: \n");
for(i = 0 ; i < 10; i++)
{
printf("%d ",arr[i]);
}
putchar(10);
return 0;
}