目录
基于链表的插入排序
https://blog.csdn.net/Doutd_y/article/details/81557320
ListNode * InsertionSort(ListNode *head)
{
if (head == NULL)
return 0;
ListNode *sortedList = new ListNode(0);
while (head != NULL)
{
ListNode *temp = head->next;
ListNode *inser = sortedList;
while (inser->next != NULL && inser->next->val < head->val)
{
inser = inser->next;
}
head->next = inser->next;
inser->next = head;
head = temp;
}
}
基于数组的插入排序
1)首先都数组的前两个数据进行从小到大的排序
2)接着将第3个数据与排好序的两个数据比较,将第3个数据插到合适的位置
3)然后,将第4个数据插入到已排好序的前三个数据当中
4)不断重复上述过程,直到把最后一个元素插入到合适位置。
void InsertionSort(int *a, int len)
{
int i, j, temp;
for (i = 1; i < len; i++)
{
j = i - 1; //j为当前大排序中的已排序序列的最后一个元素的下标
temp = a[i]; // temp为当前待插入的数
while (j >= 0 && temp < a[j]) //j>=0保证不出界,且当前待插入的数temp比a[j]小,则继续寻找temp要插入的位置j
{
a[j + 1] = a[j]; // temp值比较小,则a[j]向后移动,并更新位置j
j--;
}
a[j+1] = temp; //退出while的时候j已经做了一次自减(j--),所以退出while代表找到了比temp小元素(下标为j),则将temp放在j的后面。
}
}
基于数组的Shell排序
基于插入排序的思想:插入排序的算法复杂度为,但如果序列为正序可提高到,而且直接插入排序算法比较简单,希尔排序利用这两点得到了一种改进后的插入排序。
1)将n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对,......。
2)一次循环使每一个序列对排好顺序。
3)然后,再变成n/4个序列,再次排序。
4)不断重复上述过程,直至序列减少为1个。
void ShellSort(int *a, int len)
{
int i, j, gap;
int temp;
for (gap = len / 2; gap >= 1; gap /= 2) // 控制大的排序次数
{
for (i = gap; i < len; i++) // 以gap为步长,比较a[i]与a[i-gap]的大小,即temp与a[j]的大小
{
temp = a[i];
j = i - gap;
while (j >= 0 && temp < a[j]) // 寻找合适的插入位置,只不过步长为gap
{
a[j + gap] = a[j];
j = j - gap;
}
a[j + gap] = temp;
}
}
}