链表选择排序
#include<iostream>
using namespace std;
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList_L(LinkList &L) //创建单链表
{
L=new LNode;
L->next=NULL;
}
void input(LinkList &L,int n) //依次往单链表L里输入数据
{
int i;
LinkList p,r;
r=L;
cout<<"请输入该表的元素:";
for(i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i=0;
LNode *p;
p=L->next;
while(p)
{
if(i)
cout<<",";
cout<<p->data;
p=p->next;
i=1;
}
}
// void LinkedListSelectSort(LinkList head)
// //本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,
// //则须记下当前结点和最小结点的前驱指针
// {LinkList r,q,p=head->next;
// int t;
// while(p!=NULL)
// {q=p->next; r=p; //设r是指向关键字最小的结点的指针
// while (q!=NULL)
// {if(q->data<r->data) _____________;
// _________;
// }
// if(r!=p) { t=r->data;r->data=p->data;p->data=t;}
// ____________;
// }
//
// }
void LinkedListSelectSort(LinkList head){
LinkList save,r,p,q,s; //list指向头结点
save = head;
while(save->next){
q = save->next;
r=q;
p=q->next;
while(p){
if (p->data < q->data) //寻找值最小结点与其前驱结点
{
s = r;
q=p;
}
r = p;
p=p->next;
}
if (q!=save->next) //若最小结点不是第一个未排序结点
{
s->next = q->next;
q->next = save->next;
save->next = q;
} //将最小结点与前面一个链结点交换位置
save = q;
}
}
int main()
{
LinkList L;
int num;
cout<<"请输入单链表元素个数n:";
cin>>num;
InitList_L(L); //La表的创建
input(L,num); //依次往单链表La里输入数据
LinkedListSelectSort(L); //将单链表La和Lb进行合并
cout<<"排序后:
"; //输出合并后的单链表Lc
output(L);
cout<<endl;
return 0;
}
基本选择排序
//算法8.5 快速排序
#include <iostream>
using namespace std;
#define MAXSIZE 20 //顺序表的最大长度
typedef struct
{
int key;
char *otherinfo;
}ElemType;
//顺序表的存储结构
typedef struct
{
ElemType *r; //存储空间的基地址
int length; //顺序表长度
}SqList; //顺序表类型
int Partition(SqList &L,int low,int high)
{
//对顺序表L中的子表r[low..high]进行一趟排序,返回枢轴位置
int pivotkey;
L.r[0]=L.r[low]; //用子表的第一个记录做枢轴记录
pivotkey=L.r[low].key; //枢轴记录关键字保存在pivotkey中
while(low<high)
{ //从表的两端交替地向中间扫描
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high]; //将比枢轴记录小的记录移到低端
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low]; //将比枢轴记录大的记录移到高端
}//while
L.r[low]=L.r[0]; //枢轴记录到位
return low; //返回枢轴位置
}//Partition
void QSort(SqList &L,int low,int high)
{ //调用前置初值:low=1; high=L.length;
//对顺序表L中的子序列L.r[low..high]做快速排序
int pivotloc;
if(low<high)
{ //长度大于1
pivotloc=Partition(L,low,high); //将L.r[low..high]一分为二,pivotloc是枢轴位置
QSort(L,low,pivotloc-1); //对左子表递归排序
QSort(L,pivotloc+1,high); //对右子表递归排序
}
} //QSort
void QuickSort(SqList &L)
{
//对顺序表L做快速排序
QSort(L,1,L.length);
} //QuickSort
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n; //输入个数
cout<<"请输入待排序的数据:
";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
void main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
QuickSort(L);
cout<<"排序后的结果为:"<<endl;
show(L);
}