插入排序一般用直接插入法,时间复杂度:最好情况O(n),平均情况和最差情况复杂度为O(n^2)。
基本方法是:序列分为有序列和无序列,然后每次从无序列取出一个元素,与有序列进行比较,插入进有序列,直至无序列为空。
假设序列为[9,8,7,6,5,4,3,2,1]
则产生有序列[9],无序列为[8,7,6,5,4,3,2,1];
然后无序列取出8,插入有序列,得到[8,9],有序列进行数组的移动;
重复这个过程,直至数组排序完成。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
void InsertionSort(vector<int>&num)
{
if (num.size() <= 1) return;
int i, j, temp;
for (i = 1; i < num.size(); i++)
{
temp = num[i];//取无序列的第一个元素
j = i - 1;//[0,j]为有序列,[i,num.size()-1]为无序列
while (j >= 0 && temp < num[j])//如果待插入元素小于有序列最后一位,则继续判断有序列前一位元素和带插入元素的大小
{
num[j + 1] = num[j];//有序列后移一位
j--;//从后向前,继续选择插入的合适位置
}
num[j + 1] = temp;
}
}
int main()
{
vector<int> a;
int i;
while (cin >> i)
{
a.push_back(i);
if (cin.get() == '\n') break;
}
InsertionSort(a);
for (auto j : a)
cout << j << ' ';
system("pause");
return 0;
}
链表:
ListNode *insertionSortList(ListNode *head) {
if(!head||!head->next) return head;
ListNode *dummy = new ListNode(-1);
ListNode *p=dummy;
while(head)
{
ListNode *next=head->next;
p=dummy;
while(p->next!=NULL&&p->next->val<head->val)
{
p=p->next;
}
head->next=p->next;
p->next=head;
head=next;
}
return dummy->next;
}