#include<stdio.h>
void InsertSort(int *arr,int len)
{
int i;
for(i = 1;i < len;i++)
{
int tmp = arr[i];
int j;
for(j = i-1;j >= 0;j--)
{
if(arr[j] > tmp)
{
arr[j+1] = arr[j];
}
else
{
break;
}
}
arr[j+1] = tmp;
}
}
void Show(int *arr,int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {49,38,65,97,13,12,24};
int len = sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,len);
Show(arr,len);
return 0;
}
循环n-1趟。因为把第一个位置0堪称事一个有序的子序列,从第二个开始比较
外层循环标识并决定待比较的数值
内层循环为待比较数值并确定最终位置。
希尔排序:
#include <stdio.h>
#include <malloc.h>
void Shell_sort(int *a, int len); //函数声明
int main(void)
{
int i;
int len;
int * a;
printf("请输入要排的数的个数:");
scanf("%d",&len);
a = (int *)malloc(len * sizeof(int)); // 动态定义数组
printf("请输入要排的数:\n");
for (i = 0; i < len; i++) { //数组值的输入
scanf("%d",&a[i]);
}
Shell_sort(a, len); //调用希尔排序函数
printf("希尔升序排列后结果为:\n");
for (i = 0; i < len; i++) { //排序后的结果的输出
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
void Shell_sort(int *a, int len)
{
int i;
int j;
int temp;
int gap; //步长
for (gap = len / 2; gap >= 1; gap /= 2) { // 步长初始化为数组长度的一半,每次遍历后步长减半
for (i = 0 + gap; i < len; i += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
temp = a[i]; //备份a[i]的值
j = i - gap; //j初始化为i的前一个元素(与i相差gap长度)
while (j >= 0 && a[j] > temp) {
a[j + gap] = a[j]; //将在a[i]前且比temp的值大的元素向后移动一位
j -= gap;
}
a[j + gap] = temp;
}
}
}