顺序表实现选择排序
#include<stdio.h>
void SqSort(int a[],int n)
{
int temp,i,j,min;
for(i=0;i<n-1;i++)
{
min = i;
for(j=i+1;j<n;j++)
{
if(a[j]<=a[min])
{
min=j;
}
}
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
void print(int a[],int n)
{
int i;
for(i=0;i < n;i++)
{
printf("%d ",a[i]);
}
}
void main()
{
int a[10] = {12,33,2,5,9,88,16,13,26,10};
SqSort(a,10);
print(a,10);
}
单链表实现选择排序之for循环
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
struct Linknode *next;
}Linknode;
void CreatLinkList(int a[],Linknode *head,int n)
{
Linknode *q = head;
int i;
for(i=0;i<n;i++)
{
Linknode *p = (Linknode*)malloc(sizeof(Linknode));
p->data = a[i];
q->next = p;
q = p;
}
q->next = NULL;
}
void print(Linknode *head)
{
Linknode *p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
void Sort(Linknode *head)
{
Linknode *p,*q,*min;
int temp;
for(p=head->next;p->next!=NULL;p=p->next)
{
min = p;
for(q=p->next;q!=NULL;q=q->next)
{
if(q->data<=min->data)
{
min = q;
}
}
temp = min->data;
min->data = p->data;
p->data = temp;
}
}
void main()
{
int a[10] = {12,33,2,5,9,88,16,13,26,10};
Linknode *head = (Linknode*)malloc(sizeof(Linknode));
CreatLinkList(a,head,10);
Sort(head);
print(head);
}
单链表实现选择排序之while循环
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
struct Linknode *next;
}Linknode;
void CreatLinkList(int a[],Linknode *head,int n)
{
Linknode *q = head;
int i;
for(i=0;i<n;i++)
{
Linknode *p = (Linknode*)malloc(sizeof(Linknode));
p->data = a[i];
q->next = p;
q = p;
}
q->next = NULL;
}
void print(Linknode *head)
{
Linknode *p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
void Sort(Linknode *head)
{
int temp;
Linknode *p,*q,*min;
p = head->next;
q = p->next;
while(p->next!=NULL)
{
min = p;
while(q!=NULL)
{
if(q->data <= min->data)
{
min = q;
}
q = q->next;
}
temp = min->data;
min->data = p->data;
p->data = temp;
p=p->next;
q=p->next;
}
}
void main()
{
int a[10] = {12,33,2,5,9,88,16,13,26,10};
Linknode *head = (Linknode*)malloc(sizeof(Linknode));
CreatLinkList(a,head,10);
Sort(head);
print(head);
}
汇总一下:
#include<stdio.h>
#include<stdlib.h>
//SqSort()函数
void SqSort(int a[],int n)
{
int temp,i,j,min;
for(i=0;i<n-1;i++)
{
min = i;
for(j=i+1;j<n;j++)
{
if(a[j]<=a[min])
{
min=j;
}
}
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
//SqPrint()函数
void SqPrint(int a[],int n)
{
int i;
for(i=0;i < n;i++)
{
printf("%d ",a[i]);
}
}
//定义结点类型
typedef struct Linknode
{
int data;
struct Linknode *next;
}Linknode;
// CreatLinkList()函数
void CreatLinkList(int a[],Linknode *head,int n)
{
Linknode *q = head;
int i;
for(i=0;i<n;i++)
{
Linknode *p = (Linknode*)malloc(sizeof(Linknode));
p->data = a[i];
q->next = p;
q = p;
}
q->next = NULL;
}
//LinkPrint()函数
void LinkPrint(Linknode *head)
{
Linknode *p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
//LinkSortFor()函数
void LinkSortFor(Linknode *head)
{
Linknode *p,*q,*min;
int temp;
for(p=head->next;p->next!=NULL;p=p->next)
{
min = p;
for(q=p->next;q!=NULL;q=q->next)
{
if(q->data<=min->data)
{
min = q;
}
}
temp = min->data;
min->data = p->data;
p->data = temp;
}
}
//LinkSortWhile函数
void LinkSortWhile(Linknode *head)
{
int temp;
Linknode *p,*q,*min;
p = head->next;
q = p->next;
while(p->next!=NULL)
{
min = p;
while(q!=NULL)
{
if(q->data <= min->data)
{
min = q;
}
q = q->next;
}
temp = min->data;
min->data = p->data;
p->data = temp;
p=p->next;
q=p->next;
}
}
void main()
{
printf("1 顺序表选择排序 2 单链表选择排序for循环 3单链表选择排序while循环\n");
int c;
scanf("%d",&c);
int a[10] = {12,33,2,5,9,88,16,13,26,10};
Linknode *head = (Linknode*)malloc(sizeof(Linknode));
CreatLinkList(a,head,10);
switch(c)
{
case 1: SqSort(a,10); SqPrint(a,10); break;
case 2: LinkSortFor(head); LinkPrint(head);break;
case 3: LinkSortWhile(head); LinkPrint(head);break;
}
}
总结:选择排序的思想就是,每次选出一个最小的放在接下来固定的那个位置。无论是顺序表还是单链表,虽然物理结构不同,但是排序的算法思想是一样的。由于选择排序是固定了位置再定值,所以涉及到链表的操作时并不需要断链和接链。