每日一题(91) - 插入排序

这篇博客介绍了插入排序的基本思想,包括基于数组和链表的两种实现方式。在数组实现中,强调了查找待排序元素位置的灵活性,可以从前向后或从后向前。而对于链表,通常采用从前向后的方式。文中提供了相应的代码示例来阐述这一过程。
摘要由CSDN通过智能技术生成

题目来自网络

题目(1):基于数组的插入排序

思路:总是把待排序元素插入已排序的元素集合中,程序的重点是查找待排序元素的位置。

查找待排序元素的位置时,

对于数组,既可以从前往后找,也可以由后往前找。

对于链表,可以从前往后找。

代码:

void InsertSort(int nArr[],int nLen)
{
	int j = 0;
	for (int i = 2;i <= nLen;i++)
	{
		if (nArr[i] < nArr[i - 1])
		{
			nArr[0] = nArr[i];

			j = i - 1;
			while(nArr[0] < nArr[j])
			{
				nArr[j + 1] = nArr[j];
				j--;
			}
			nArr[j + 1] = nArr[0];
		}
	}
}

题目(2):基于链表的插入排序

思路:基于链表的插排,可以看成一个旧链表中的一个结点要插入到一个新链表的结点中。

代码:

#include <iostream>
using namespace std;

struct ListNode
{
	int m_nData;
	ListNode* pNext;
};

void InsertSort(ListNode*& pHead)
{
	ListNode* pCurOld = pHead;
	ListNode* pCurOldNext = pHead;
	ListNode* pCurNew = pHead;
	ListNode* pLast = NULL;
	pHead = NULL;
	while(pCurOld != NULL)
	{
		pCurOldNext = pCurOld -> pNext;
		if (pHead == NULL)
		{
			pCurOld->pNext = pHead;
			pHead = pCurOld;

			pLast = pCurOld;
		}
		else if (pHead->m_nData > pCurOld->m_nData)
		{
			pCurOld->pNext = pHead;
			pHead = pCurOld;
		}
		else if (pLast->m_nData <= pCurOld->m_nData)
		{
			pLast->pNext = pCurOld;
			pCurOld->pNext = NULL;
			pLast = pCurOld;
		}
		else
		{
			pCurNew = pHead;
			while(pCurNew->pNext->m_nData < pCurOld->m_nData)
			{
				pCurNew = pCurNew->pNext;
			}
			pCurOld->pNext = pCurNew->pNext;
			pCurNew->pNext = pCurOld;
		}
		pCurOld = pCurOldNext;
	}
}

void Print(ListNode* pHead)
{
	while(pHead != NULL)
	{
		cout<<pHead->m_nData<<" ";
		pHead = pHead->pNext;
	}
	cout<<endl;
}

void CreateList(ListNode** pHead,int nLen)//头指针使用指针的指针  
{  
	ListNode* pCur = NULL;  
	ListNode* pNewNode = NULL;  
	for (int i = 0;i < nLen;i++)  
	{  
		pNewNode = new ListNode;  
		cin>>pNewNode->m_nData;  
		pNewNode->pNext = NULL;  

		if (*pHead == NULL)  
		{  
			*pHead = pNewNode;  
			pCur = *pHead;  
		}  
		else  
		{  
			pCur->pNext = pNewNode;  
			pCur = pNewNode;  
		}  
	}  
}  

int main()
{
	int nLen = 4;
	ListNode* pHead = NULL;
	CreateList(&pHead,nLen);
	InsertSort(pHead);
	Print(pHead);
	system("pause");
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值