OK,我们经常会用到排序算法。那么,常用的排序算法,除了使用数组之外,用链表又该如何处理呢?下面我们来做个对比:
//使用插入排序对数组进行排序
int *get_order(int *num, int length)
{
for(int eiter = 1; eiter < length; eiter++)
{
int temp_value = num[eiter];//把将要插入的值做个标记
int iiter = eiter-1;
while(iiter >= 0 && num[iiter] > temp_value)//
{//在向前移动的过程中,如果值都大于标记,则一直向前走
num[iiter+1] = num[iiter];//该值向前走的过程,遇到的值向后移
iiter--;
}
num[iiter+1] = temp;//最后找到该值应该在的位置。
}
return num;
}
//使用插入排序的方法对链表进行排序
linklist *get_order(linklist *llist)
{
linklist *unfirst = NULL;
linklist *inNode = NULL; //原链表的两个节点指针
linklist *pre_cur = NULL;
linklist *cur = NULL; //要插入链表的两个节点指针
if (llist -> next == NULL)
return NULL;
cur = llist -> next;//指向链表第一个节点
unfirst = cur -> next;
cur -> next = NULL;//将原链表的第一个节点与后面拆开,新链表只包含一个节点。旧链表以原第二个为起始
while(unfirst)//遍历旧链表节点
{
inNode = unfirst;//标记要插入到新链表的节点
cur = llist -> next;//每次从新链表(已排好序)起始向后比较
while(cur && unfirst -> data > cur -> data)
{
pre_cur = cur;
cur = cur -> next;//设两个指针,来保证好插入pre_cur————inNode————cur
}
unfirst = unfirst -> next;//插入之前,旧链表节点指针后移.(插入之后,该点在旧链表就消失了)
if (cur == llist -> next)
llist -> next = inNode;//插入到头上
else
pre_cur -> next = inNode;//插入到中间
inNode -> next = cur;
}
}
//使用选择排序对数组进行排序
int *get_order(int *num, int length)
{
for (int eiter = 0; eiter < length; eiter++)
{
int min = eiter;//将现在位置确定为最小值所在位置,即设当前为最小值;
for(int iiter = eiter+1; iiter < length; iiter++)
{
if (num[min] > num[iiter])
min = iiter;//通过在数组中的所有对比找出真正的最小值;
}
if(min != eiter)//如果假设的最小值i不是实际求得的最小值min,则进行函数值的交换;
swap(num[min],num[eiter]);
}
return num;
}
//使用选择排序的方法对链表进行排序
linklist *get_order(linklist *llist)
{
for(linklist *eiter = llist->next; eiter !=NULL; eiter = eiter -> next)
{
for(linklist *iiter = eiter->next; iiter != NULL; iiter = iiter -> next)
{
if (iiter->data < eiter -> data)
{
int temp = iiter -> data;
iiter -> data = eiter -> data;
eiter -> data = temp;
}
}
}
return llist;
}
//使用冒泡排序对数组进行排序
void bubble_sort(int arr[], int len)
{
int i, j;
for (i = 0; i < len - 1; i++) //外层循环控制趟数,总趟数为len-1
for (j = 0; j < len - 1 - i; j++) //内层循环为当前i趟数 所需要比较的次数
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
//使用冒泡排序的方法对链表进行排序
linklist *get_order(linklist *llist)
{
for(linklist *eiter = llist->next; eiter->next != NULL; eiter = eiter ->next)
{
for(linklist *iiter = llist -> next; iiter->next != NULL; iiter = iiter -> next)
{
if (iiter -> data > iiter -> next -> data)
swap(iiter->data, iiter->next->data);
}
}
return llist;
}
这些代码是建立在读者已经了解数据结构知识的基础上。