排序算法--插入排序(C++)

插入排序一般用直接插入法,时间复杂度:最好情况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;
    }

posted @ 2018-05-09 20:19  依然有清风  阅读(495)  评论(0编辑  收藏  举报