鏈表選擇排序
#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<<"排序後:\n"; //輸出合併後的單鏈表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<<"請輸入待排序的數據:\n";
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);
}