简单选择排序的设计与实现
排序思想
简单选择排序:故名是通过一次次的选择再交换来实现的。
1、从长度为n的序列中选择最小/大值与该段序列的首元素交换位置。
2、对余下的n-1个,重复进行1操作,直到最后一个。
3、每进行一趟可以确定一个正确位置。
代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;//数据域
struct Node *next;//下一个元素的存储位置
int length;//表长度
}Node,*LinkList;
//链表赋值
void LinkInput(LinkList &L);
//简单选择排序-由小到大
void selectSort(LinkList &L);
//输出链表信息
void LinkListTraverse(LinkList C);
int main(){
//建立单链表A
LinkList A = (LinkList) malloc (sizeof(Node));
A->next = NULL;//头结点
//链表赋值
LinkInput(A);
printf("排序前:");
LinkListTraverse(A);//顺序输出连边信息
selectSort(A->next);//将除了头结点的,作为参数传入
printf("排序后:");
LinkListTraverse(A);
return 0;
}//end-main
//赋值
void LinkInput(LinkList &L){
LinkList end = L;//end指向链表L的头结点
int m;
printf("请依次输入五个整数:");
for(int i = 1;i <= 5;i++){//建立
scanf("%d",&m);//输入数据不重复
Node *q = (Node *) malloc (sizeof(Node));
q->next = NULL;
q->data = m;
//尾插法
end->next = q;
end = q;
}//end-for
}//end-function
//简单选择排序
void selectSort(LinkList &L){
LinkList p,q,current;
int min;
if(!p || !p->next){//当为空,或只有一个的时候直接结束
return ;
}
for(p = L;p;p = p->next){//外层遍历链表L
q = p;//q指向链表序列的首结点
current = p;//哨兵指针-用于表示最小结点所在位置
min = q->data;//将首结点的值赋予min
while(q){
if(min > q->data){
min = q->data;//赋值最小
current = q;//指向最小的结点
}
q = q->next;
}//end-while
//将current与p的数据交换
if(current != p){//如果current指向了其他,代表需要交换位置
current->data = p->data;
p->data = min;
}
}//end-for
}//end-function
//遍历
void LinkListTraverse(LinkList L){
while(L->next){
printf("%d ",L->next->data);
L = L->next;
}
printf("\n");
}//end-function
效果: