链表上的冒泡、选择排序算法

做如下定义

typedef struct LNode
{
    int num;
    char name[20];
    struct LNode *next;
} LNode, *LinkList;

冒泡排序算法

void BubbleSort(LinkList &L)
{
    LinkList i = NULL, j = NULL;
    for (i = L; i->next->next != NULL; i = i->next)
    {
        for (j =i ; j->next->next != NULL; j = j->next)
        {
            if (j->next->num > j->next->next->num)
            {
                LinkList a = NULL, b = NULL,c = NULL;
                a = j->next;
                b = j->next->next;
                c = j->next->next->next;
                j->next = b;
                j->next->next = a;
                j->next->next->next = c;
            }
        }
    }
}

选择排序算法

void SelectSort(LinkList &L)
{
    LinkList i=NULL, j=NULL, min_n=NULL;
    int k = 1;
    for (i = L; i->next!=NULL; i=i->next)
    {
        min_n = i;
        for (j = i ->next; j->next!=NULL; j=j->next)
        {
            if (min_n->next->num > j->next->num)
            {
                min_n = j;
            }
        }
        if (min_n->next->num != i->next->num)
        {
            if (i->next != min_n)
            {
                LinkList a = NULL, b = NULL, c = NULL, d = NULL;
                a = i->next;b = i->next->next;
                c = min_n->next;d = min_n->next->next;

                i->next = c;i->next->next = b;
                min_n->next = a;min_n->next->next = d;
            }
            else
            {
                LinkList a = NULL, b = NULL, c = NULL;
                a = i->next;b = i->next->next;
                c = i->next->next->next;

                i->next = b;i->next->next = a;
                i->next->next->next = c;
            }

        }
    }
}

测试代码

#define _CRT_SECURE_NO_WARNINGS
//此行系VS2017,读者请合情取舍
#include<iostream>
#include<cstdlib>
#include<string.h>
using namespace std;
typedef struct LNode
{
    int num;
    char name[20];
    struct LNode *next;
} LNode, *LinkList;

void Show(LinkList L)
{
    LinkList p = L->next;
    while (p != NULL)
    {
        cout << p->num << "\t  " ;
        p = p->next;
    }
    cout << "\n";
    p = L->next;
    while (p != NULL)
    {
        cout << p->name << "\t";
        p = p->next;
    }
    cout << "\n";
}

void BubbleSort(LinkList &L)
{
    LinkList i = NULL, j = NULL;
    int k = 1;
    for (i = L; i->next->next != NULL; i = i->next)
    {
        for (j =i ; j->next->next != NULL; j = j->next)
        {
            if (j->next->num > j->next->next->num)
            {
                LinkList a = NULL, b = NULL,c = NULL;
                a = j->next;
                b = j->next->next;
                //a、b保存要交换的两个节点
                c = j->next->next->next;
                //c保存j->next->next最后完成链表的连接
                j->next = b;
                j->next->next = a;
                j->next->next->next = c;
            }
        }
        //cout << "第" << k++ << "趟\n";
        //Show(L);
    }
}
void SelectSort(LinkList &L)
{
    LinkList i=NULL, j=NULL, min_n=NULL;
    int k = 1;
    //置min_next->next指向含最小值的结点
    for (i = L; i->next!=NULL; i=i->next)
    {
        min_n = i;
        for (j = i ->next; j->next!=NULL; j=j->next)
        {//查找最小值,并标记
            if (min_n->next->num > j->next->num)
            {
                min_n = j;
            }
        }
        if (min_n->next->num != i->next->num)
        {//这儿的交换分成了两种情况,1.不相邻交换 2.相邻交换
            //(相邻交换和冒泡算法的交换相同)
            //这部分写的繁了我相信聪明的读者可以优化它
            if (i->next != min_n)
            {
                LinkList a = NULL, b = NULL, c = NULL, d = NULL;
                a = i->next;
                b = i->next->next;
                c = min_n->next;
                d = min_n->next->next;

                i->next = c;
                i->next->next = b;
                min_n->next = a;
                min_n->next->next = d;
            }
            else
            {
                LinkList a = NULL, b = NULL, c = NULL;
                a = i->next;
                b = i->next->next;
                c = i->next->next->next;

                i->next = b;
                i->next->next = a;
                i->next->next->next = c;
            }

        }
        //cout << "第" << k++ << "趟\n";
        //Show(L);
    }
}
void Init(LinkList &L)
{
    LinkList l1, l2, l3, l4,l5;

    L = (LinkList)malloc(sizeof(LNode));
    l1 = (LinkList)malloc(sizeof(LNode));
    l2 = (LinkList)malloc(sizeof(LNode));
    l3 = (LinkList)malloc(sizeof(LNode));
    l4 = (LinkList)malloc(sizeof(LNode));
    l5 = (LinkList)malloc(sizeof(LNode));

    l1->num = 10; strcpy(l1->name, "10s"); l1->next = NULL;
    l2->num = 9; strcpy(l2->name, "9s"); l2->next = NULL;
    l3->num = 11; strcpy(l3->name, "11s"); l3->next = NULL;
    l4->num = 8; strcpy(l4->name, "8s"); l4->next = NULL;
    l5->num = 12; strcpy(l5->name, "12s"); l5->next = NULL;

    L->next = l1;   l1->next = l2; l2->next = l3;
    l3->next = l4; l4->next = l5;
}
int main()
{
    LinkList L;

    //Init(L);
    //cout << "链表\n";
    //Show(L);
    //BubbleSort(L);
    //cout << "冒泡\n";
    //Show(L);

    Init(L);
    cout << "链表\n";
    Show(L);
    SelectSort(L);
    cout << "选择\n";
    Show(L);

    cout << "\nEnd!";
    return 0;
}

原文地址:https://www.cnblogs.com/loeFairy/p/12244203.html

时间: 2024-12-14 18:00:04

链表上的冒泡、选择排序算法的相关文章

选择排序算法(排序详解)

直接插入排序(Selection Sort)算法 1.基本思想: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面). n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空.

选择排序算法---直接选择排序和堆排序

本文主要是解析选择排序算法:直接选择排序和堆排序. 一.直接选择排序   基本思想:       选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终

简单排序之选择排序算法JAVA实现

选择排序原理 选择排序是一种简单排序算法.这是一个基于位置比较的算法,通常实现是左边是已经排好序的元素列表,右边是待排序的元素.当然,一开始的时候,我们认为都是未经排序的. 选择排序的精髓:与冒泡排序不同,选择排序是第N趟排序先确定最小元素的位置,然后和第N个元素交换位置.主要特点是每一趟选择一个最小值的索引作为梅一堂最后交换的位置.以一个元素个数为N的整形数组arr为例: 第一趟 以第一个元素arr[0]为基准,准备好一个中间变量temp用来记录该趟最小元素的位置,一开始,temp=0,比较a

基于Java实现的选择排序算法

选择排序和冒泡排序同样是基础排序算法,现在也做个学习积累. 简述 选择排序算法较为稳定,基本上都是O(n2)的时间复杂度,规模越小排序越快,不需要占用额外空间.其实选择排序原理很简单,就是在未排序序列中找到最小(大)的元素然后放到数组前面,然后再从剩下的未排序序列中找到最小(大)的元素放在上一次找到最小(大)元素的后面,以此类推完成排序. 动图演示 看下动图上的演示,就能够找出排序规律,非常之简明易懂. (算法动图来源于参考资料,详细请往下翻阅) 代码实现 1 /** 2 * 选择排序 3 *

【排序】选择排序算法

特别说明 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 选择排序思想 选择排序又称为简单选择排序,主要思想描述如下: 01.假设待排序列表为 .选择排序将  划分为由已排序好序的  部分 以及 未排序的  部分: 注意:刚开始时  部分其实可认为只有一个元素,即: 元素 02.每次从  部分中选出最小(或最大)的那个元素,将其放在  的末尾位置: 03.重复02步骤,直到  部分为空为止: 编码参考 简单选择排序是非常简单的一种排序

选择排序算法实现

//选择排序法 //time :2017.3.8 //author :justing_zhang /****************************************************************************************/ #include <stdio.h> void println(int array[], int len){    int i = 0;        for(i=0; i<len; i++)    {     

选择排序算法实现十个1-100的随机数的排序

public class Mian {//对数进行选择排序 public static void selectnumber(int[] number){ for(int i=0;i<number.length-1;i++){ int m=i; for(int j=i+1;j<number.length;j++){ if(number[j]<number[m]){ m=j; } if(i!=m){ swap(number,i,m); } } } } //交换两个数 public stati

Java学习资料-Java常用算法-选择排序算法

ChooseSort源程序public class ChooseSort { private static void ChooseSort (int [] a){  for(int i = 0; i < a.length; i++){   //对数组循环,假设数据排在前面的元素总比后面的小,然后与后面的数据进行比较   int k = i;   for(int j = i+1; j <a.length; j++){//对数据遍历,寻找最小的数据元素的数组下标    if(a[j]<a[k

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j