1.直接插入排序算法。
单趟排序:
我们以升序为例子,简单来说就是将大数放到靠右边的位置,我们将第一个数作为当前数arr[end],将下一个数储存起来tmp=arr[end+1],然后比较下一个数和当前数的大小arr[end]?tmp,如果比当前数小,那么我们将当前数赋值给下一个数arr[end+1]=arr[end]。依次移动赋值,直到比end前面的某个数大时,停止,然然后将储存起来的数赋值给原来的位置arr[end+1]=tmp,然后对整个数组进行遍历,单趟排序就可以完成排序。
我个人的理解就是把大的值放在最后边,然后比较后面的值和当前的值大小,大的就放到最后边,小的话,就继续向前找,找到合适的位置,不管用赋值还是交换,只要达到效果就行。
2.代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void Swap(int *p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void Sort(int* arr, int n)
{
int num = arr[0];
int index = 0;
int i = 0;
while (i<=n)
{
if (num <= arr[i])
{
num = arr[i];
index = i;
++i;
}
else
{
while (index >= 0 && arr[index + 1] < arr[index])
{
Swap(&arr[index], &arr[index + 1]);
--index;
}
index = i;
++i;
num = arr[index];
}
}
}
void Print(int* arr, int n)
{
for (int i = 0; i <= n; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 1,5,6,7,8,9,64,2,5,6,5,1,3,13,13,1,5,5,15};
int n = sizeof(arr) / sizeof(arr[0]);
Sort(arr, n - 1);
Print(arr, n - 1);
system("pause");
return 0;
}
3.结果展示
4.时间复杂度空间复杂度
最好情况:正是我们需要的顺序,循环N次 时间时间复杂度为O(n).
最坏情况:与需要的顺序相反,需要循环n…1的等差数列次,时间复杂度为O(n2).
空间复杂度为O(1),没有开辟新的空间。
5.心得体会
写这种题,最好先找到单趟排序的算法。单趟算法出来了,循环就出现多趟解法,所以一定要学会拆分问题。