链表排序

链表是一种在物理存储上非连续,非顺序的存储结构,数据的逻辑关系是通过指针链接次序实现的,链表通过一系列结点组成,结点可以在运行时动态生成。每个结点由两部分组成:数据域和存储下一结点的指针域。链表是一种常见的数据结构。

要想进行链表排序,首先得建立一个单链表,程序代码是由一个数组转化而来,代码如下:

先建立一个结点的结构体:

struct node
{
	int val;
	node *next;
};
node* _initial_node() //生成一个空的链表
{
	node *head=new node;
	head->val=0;
	head->next=NULL;
	return head;
}
node* _create(int *A,int length)  //将一个线性数组转化为一个单链表
{
	node *p1,*p2,*head;
	head=new node;
	head->val=A[0];

	p1=new node;
	head->next=p1;

	for(int i=1;i<length;i++)
	{
		if(i==length-1)
			p2=NULL;
		else
			p2=new node;
		p1->val=A[i];
		p1->next=p2;
		p1=p2;

	}
	return head;
}

链表排序可以适用于插入排序方法和冒泡排序方法:本文用插入排序来做演示:

设计的思路:将要排序的链表中的数组的数值一一插入到一个新的空的链表中实现排序,插入的要求,检查数组和链表中的数值的大小,若比链表中的某个数值大,则将这个数值插入到这个结点的前面,若此链表中的所有的数都比这个数值大,则将这个数值插入到这个链表的最后的位置,插入数值的代码如下:

void _add_node(node *A,int x)
{
	node *temp=A,*Base,*temp1;

	Base=new node;
	Base->val=x;

	if(temp->val<x)
		Base->next=temp;
	else
	{
		temp=A->next;
		temp1=A;
		while(temp)
		{
			if(temp->val<x)
			{
				Base->next=temp;
				temp1->next=Base;
				break;
			}
			temp1=temp;
			temp=temp->next;
		}
		if(temp==NULL)
		{
			temp1->next=Base;
			Base->next=NULL;
		}
	}
}

下面就是链表插入排序的实现代码:

void main()
{
	int ia[]={9,2,0,3,1,8,3};
	node *he=_create(ia,7);
	node *A=_initial_node();
	int num=he->val;
	A->val=num;
	for(he=he->next;he!=NULL;he=he->next)
	{
		num=he->val;
		_add_node(A,num);
	}
	_show(A);
}

其中_show()函数是显示链表内容的函数,代码如下:

void _show(node *A)
{
	for(;A!=NULL;A=A->next)
	{
		cout<<A->val<<" ";
	}
	cout<<endl;
}

测试结果如下:

时间: 2024-08-04 13:26:57

链表排序的相关文章

【模板小程序】链表排序(qsort/insert_sort/merge_sort)

前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 二.模板版本(适用性广泛) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 总结 参考文章 一.针对整数的版本(常用) 文中链表定义: 1 //definition for singly-linked list. 2 struct ListNode 3 { 4

C语言 链表排序

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 typedef struct node{ 6 int data; // 存放数据 7 struct node* next; // 下一节点 8 }ListNode; 9 10 extern int CSort(); 11 12 ListNode *root = NULL;// 13 14 int main(int argc, char

Sort List &amp;&amp; Insertion Sort List (链表排序总结)

Sort List Sort a linked list in O(n log n) time using constant space complexity. Have you been asked this question in an interview?                   Yes               说明:归并排序: 时间 O(nlogn),空间 O(1). 每次将链表一分为二, 然后再合并.快排(用两个指针) /** * Definition for sing

148. Sort List (java 给单链表排序)

题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1).时间复杂度为O(nlogn)的排序算法有快速排序和归并排序, 但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路. 编码: public ListNode sortList(ListNode head) { if(hea

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

STL 中的链表排序

一直以来学习排序算法, 都没有在链表排序上下太多功夫,因为用得不多.最近看STL源码,才发现,原来即使是链表,也能有时间复杂度为O(nlogn)的算法, 大大出乎我的意料之外,一般就能想到个插入排序. 下面的代码就是按照源码写出的(去掉了模板增加可读性),注意forward_list是C++11新加的单向链表,这里选这个是因为它更接近我们自己实现链表时的做法. void sort_list(forward_list<int>& l){ auto it = l.begin(); if (

单向链表排序

一.冒泡排序简述 1.概念 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端. 2.实例分析 以数组为例进行说明: 数组a[4] = {4,3,2,1} 从前向后依次比较两个元素的大小,如果顺序错误就交换它们.经过这样一轮,最大的元素就被

一步一步写算法(之链表排序)

原文:一步一步写算法(之链表排序) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较线性表的排序而言,链表排序的内容稍微麻烦一点.一方面,你要考虑数据插入的步骤:另外一方面你也要对指针有所顾虑.要是有一步的内容错了,那么操作系统会马上给你弹出一个exception.就链表的特殊性而言,适合于链表的排序有哪些呢? (1)插入排序    (适合) (2)冒泡排序    (适合) (3)希尔排序    (适合) (4)选择排序    (适