_ Bubbling on the list data structure, selection sorting algorithm

Defined as follows

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

Bubble sort algorithm

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

Select the sorting algorithm

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

		}
	}
}

Test code

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

Visit my station

Released two original articles · won praise 0 · Views 56

Guess you like

Origin blog.csdn.net/weixin_44306127/article/details/104078249