插入排序(Insertion sort)
插入排序是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数列,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
折半插入排序
既然是有序数列,不妨直接来折半插入~
#include <stdio.h>
#include <stdlib.h>
int *arr;
/*折半插入排序升序排列*/
void BinarryInsertSort(int len)
{
int bin,low,high,tem,j;
for(int i=0;i<len;i++)
{
tem=arr[i];
low = 0;
high = i;
while(low<=high)
{
bin = (low + high)/2;
if(tem<=arr[bin])
high=bin-1;
if(tem>arr[bin])
low = bin+1;
}
for(j = i-1;j>high;j--)
arr[j+1]=arr[j];
arr[j+1]=tem;
}
}
int CreateArray()
{
int len=0;
printf("Please enter the number of Numbers to sort:\n");
scanf("%d",&len);
arr = malloc(sizeof(int)*len);
for(int i=0;i<len;i++)
{
printf("Please enter an integer of NO.%d to sort:\n",i+1);
scanf("%d",&arr[i]);
}
return len;
}
int main()
{
int len = CreateArray();
BinarryInsertSort(len);
for(int i=0;i<len;i++)
printf("%d\n",arr[i]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//int *arr;
void BinarryInsertSort(int len,int **arr)
{
int bin,low,high,tem,j;
for(int i=0;i<len;i++)
{
tem=*arr[i];
low = 0;
high = i;
while(low<=high)
{
bin = (low + high)/2;
if(tem<=*arr[bin])
high=bin-1;
if(tem>*arr[bin])
low = bin+1;
}
for(j = i-1;j>high;j–)
*arr[j+1]=*arr[j];
*arr[j+1]=tem;
}
}
int CreateArray(int **arr)
{
int len=0;
printf(“Please enter the number of Numbers to sort:\n”);
scanf("%d",&len);
*arr = malloc(sizeof(int)*len);
for(int i=0;i<len;i++)
{
printf(“Please enter an integer of NO.%d to sort:\n “,i+1);
scanf(”%d”,arr[i]);
}
return len;
}
int main()
{
int **arr;
int len = CreateArray(arr);
BinarryInsertSort(len,arr);
printf(“the result is :\n”);
for(int i=0;i<len;i++)
printf("%d\n",*arr[i]);
return 0;
}
这里说一下为什么要用二级指针传参
误区:
使用一级指针
看上去合情合理,把malloc得到的地址赋给arr,然而主函数里的值并没有发生变化。
为什么?
因为arr进入子函数后移情别恋了,指向了我给他分配的内存空间,而主函数里的arr却还指向着他的初恋,毫不知情。
如何破?
将malloc得到的内存首地址通过二级指针传给主函数。
*arr = malloc();这里就把申请的内存给了 *arr,这次变心的就是 **arr了,arr依旧是那个arr。