C++实现数组和链表的排序算法

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;
}

这些代码是建立在读者已经了解数据结构知识的基础上。

猜你喜欢

转载自blog.csdn.net/LiuPeiP_VIPL/article/details/81987493
今日推荐