***单链表排序之选择排序***
/*
前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的选择排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);
单链表的选择排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);
选择排序的基本思想:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量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,
从下一个节点开始,以此类推;
*/
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 中了;
//以此类推;
}
}
接下来还会完成单链表的直接插入和冒泡排序!