单链表排序之选择排序
2016-06-07 11:36
204 查看
***单链表排序之选择排序***
/*前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的选择排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);
选择排序的基本思想:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
其实再通俗一点就是,假设数组有好几个元素,我的第一个位置就是给数组里最小的元素留的位置,如果第一个位置现在的元素不是最小,那么不好意思,请让开位置,把最小的元素换过来(注意是交换过来);接下来第一个就不管了,位置固定死了,第二个位置又是为剩下的所有元素中最小的元素准备的,如果当前位置里的元素不是最小,那么不好意思,选择剩下元素最小的那个和它交换,以此类推;
选择排序的数组排序的我已经总结过了,这里就将选择排序复用到单链表里面;
*/
/* 举个例子:
4------->3------->2------>6------->over;
p->data = 4; q->data = 4;
内层第一次:4 = 4,不交换,q->data = 3; 4 > 3(交换);则p->data = 3;
继续,q->data = 2, 3 > 2(交换),则p->data = 2;
继续,q->data = 6, 2 < 6(不交换),则p->data = 2;
第一次完成后:
p->data = 2; 后面的顺序不用考虑;第一个节点也不用管了, p = p->next,
从下一个节点开始,以此类推;
*/
#include<stdio.h> #include<assert.h> typedef int DataType; typedef struct LinkNode { DataType data; struct LinkNode* next; }LinkNode,*pLinkNode;//结点结构体 typedef struct LinkList { LinkNode* pHead;//头结点指针 }LinkList ,*pLinkList;//链表
算法实现:
void SelectSort(pLinkList pList)//选择排序单链表 { pLinkNode p = NULL; pLinkNode q = NULL; assert(pList); for(p = pList ->pHead ;p!=NULL; p = p->next ) { //注意:q = p->next 外循环进来每次向后挪动一个; for(q = p->next;q!=NULL; q = q->next )//找最小的结点 { if(p->data > q->data )//只要大就交换,改变的只是data { DataType tmp = q->data ; q->data = p->data ; p->data = tmp; } }//第一次内层循环结束后,就已经将最小的放入第一个节点的data 中了; //以此类推; } }
接下来还会完成单链表的直接插入和冒泡排序!
相关文章推荐
- 在命令行用 sort 进行排序
- 文件遍历排序函数
- 关于C#中排序函数的总结
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- MYSQL必知必会读书笔记第五章之排序检索数据
- SQLSERVER的排序问题结果不是想要的
- Ruby实现插入排序算法及进阶的二路插入排序代码示例
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 经典排序算法之冒泡排序(Bubble sort)代码
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的