冒泡:注意代码的两个位置
每一趟(外循环)都从首节点开始找
每一次(内循环)比较后链表后移
void BubbleSortLink(LinkList *L) //交换结点数据域---冒泡排序实现
{
int len = LenLink(L);//获取链表长度
LinkList *p = NULL;
int i, j, temp;
for (i = 0; i < len - 1; i++)
{
p = L->next;//位置1
for (j = 0; j < len - i - 1; j++)
{
if (p->data > p->next->data)
{
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next;//位置2
}
}
}
插入:网上找的一堆while循环写的,没有图示,思路不清晰;这里给出插入排序和链表插入排序 以供比较(easy)
主要思想就是顺序遍历p,记录p,然后从头在L中找p的插入位置,将p插入即可
void InsertSort(int arr[], int length)
{
int i, j; //j为开始查找的位置
for (i = 1; i < length; i++) //从第2个数据开始插入
{
if (arr[i - 1] > arr[i]) //若待插入元素已经有序,则不进入if
{
int temp = arr[i]; //拿出待插入元素(后)
for (j = i - 1; j >= 0 && temp < arr[j]; j--) //从已排序的最右边开始,把大于当前插入元素的元素后移
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp; //将temp插到arr[j+1]的位置(即空的那个位置)
}
}
}
//链表插入排序
void InsertSortlink(LinkList *L)
{
LinkList *x, *y; //原链表的前后指针
LinkList *pre, *p; //新链表的前后指针
//将L先保存到p中,再清空L,L成为新链表
p = L->next;
L->next = NULL;
//从第一个元素开始插入 (头节点不用插入,所以也就是意义上的第二个元素)
for (x = p; x != NULL; x = y)
{
LinkList *temp = x; //记录待插入元素
y = x->next; //保护插入元素后面的元素,方便后移
//找待插入位置和其前一个位置 初始pre = L,p=L->next
//找不到就继续向后找
for (pre = L, p = L->next; p != NULL && temp->data > p->data; pre = p, p = p->next)
;
//保护后面的元素
temp->next = p;
//插入
pre->next = temp;
}
}