直接插入排序
方法:数据r[1]到r[i-1]是有序的,r[i]到r[n]是任意次序的。将r[i]插入到r[1]到r[i-1]中并使得r[1]到r[i]有序。i从2开始到结束进行n-1次。例
48 62 35 77 55 14 35 98
{48} 62 35 77 55 14 35 98
{48 62} 35 77 55 14 35 98
{35 48 62} 77 55 14 35 98
{35 48 62 77} 55 14 35 98
{35 48 55 62 77} 14 35 98
{14 35 48 55 62 77} 35 98
{14 35 35 48 55 62 77} 98
{14 35 35 48 55 62 77 98}
代码:
//插入排序
void InsertSort(int *arr, int length)
{
for (int j = 1; j < length; j++)//循环
{
int key = arr[j];
int j = j-1;
while (i >= 0 && key <= arr[i])//判断是否满足插入条件
{
arr[i+1] = arr[i];
i--;
}
arr[i+1] = key;
}
}
希尔排序
算法思想:
(1)选定记录间的距离为d1在整个待排序记录序列中将所有间隔为d1的记录分成一组,进行组内直接插入排序;
(2)取记录间的距离为d2(d2 < d1),在整个待排序记录序列中,将所有间隔为d2的记录分成一组,进行组内直接插入排序;
(3)重复步骤2,直至记录间的距离d=1,此时整个只有一个子序列,对该序列进行直接插入排序,完成整个排序过程。例如:
初始: 49 38 65 97 76 13 27 48 55 4
取d = 5
一趟分组:
一趟排序: 13 27 48 55 4 49 38 65 97 76
取d = 3
二趟分组:
二趟排序:13 4 48 38 27 49 55 65 97 76
取d = 1
三趟排序:4 13 27 38 48 49 55 65 76 97
代码:
//希尔排序
void ShellSort(int *arr, int length)
{
for (int d = 5; d > 0; d -= 2)//躺数,也可传参数
{
for (int i = d; i < length; i++)//要插入的次数
{
int key = arr[i];
for (int j = i-d; j >= 0; j -= d)
{
if (key < arr[j])
{
Swap(&arr[j+d], &arr[j]);
}
else
{
break;
}
}
}
}
}
插入排序和希尔排序的实现:
#ifndef Sort_h__
#define Sort_h__
#include <stdio.h>
#include <stdlib.h>
//输出
void Show(int *arr, int length);
//交换
void Swap(int *num1, int *num2);
//插入排序
void InsertSort(int *arr, int length);//时间复杂度O(n^2),
//希尔排序
void ShellSort(int *arr, int length);
#endif // Sort_h__
以上函数的实现:
#include "Sort.h"
//输出
void Show(int *arr, int length)
{
for (int i = 0; i < length; i++)
{
printf("%d,", arr[i]);
}
printf("\b \n");
}
//交换
void Swap(int *num1, int *num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
//插入排序
void InsertSort(int *arr, int length)
{
for (int j = 1; j < length; j++)
{
int key = arr[j];
int i = j-1;
while (i >= 0 && key <= arr[i])
{
arr[i+1] = arr[i];
i--;
}
arr[i+1] = key;
}
}
//希尔排序
void ShellSort(int *arr, int length)
{
for (int d = 5; d > 0; d -= 2)//躺数,也可传参数
{
for (int i = d; i < length; i++)//要插入的次数
{
int key = arr[i];
for (int j = i-d; j >= 0; j -= d)
{
if (key < arr[j])
{
Swap(&arr[j+d], &arr[j]);
}
else
{
break;
}
}
}
}
}
测试代码:
#include "Sort.h"
int main(void)
{
int arr[] = {9,8,7,6,5,4,3,2,34,56,74,90,5};
int length = sizeof(arr)/sizeof(arr[0]);
printf("----------没有排序---------\n");
Show(arr, length);
#if 0
printf("----------插入排序---------\n");
InsertSort(arr, length);
Show(arr, length);
#endif
printf("----------希尔排序---------\n");
ShellSort(arr, length);
Show(arr, length);
return 0;
}