第1关:简单选择排序算法
#include <iostream>
using namespace std;
#define OK 1;
typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkedList;
int LinkCreate(LinkedList &head)
{
int i=0,n;
LinkedList p,rear;
head = new Node;
head->next = NULL;
rear=head;
cin>>n;
while(i<n)
{
i++;
p=new Node;
cin>>p->data;
p->next=NULL;
rear->next=p; //将新结点链入到尾部
rear=p; //新结点变成新的尾部
}
return OK;
}
void LinkedListSelectSort(LinkedList head)
//本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,则须记下
//当前结点和最小结点的前驱指针
{
//###### Begin ######
LinkedList p = head -> next,q,temp;
while(p -> next)
{
temp = p;
q = p -> next;
while(q)
{
if(temp -> data > q -> data) temp = q;
q = q -> next;
}
if(p -> data != temp -> data)
{
int t = p -> data;
p -> data = temp -> data;
temp -> data = t;
}
p = p -> next;
}
// ###### End ######
}
void LinkOut(LinkedList head) //对链表的输出
{
LinkedList p;
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
LinkedList head;
if(LinkCreate(head))
cout<<"创建成功"<<endl;
LinkedListSelectSort(head);
LinkOut(head);
}
第2关:直接插入排序实现
#include <iostream>
using namespace std;
# define MAXSIZE 20 //设记录不超过20个
# define OK 1;
typedef struct { //定义顺序表的结构
int r[MAXSIZE+1]; //存储顺序表的向量 r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
}SqList;
int ListCreate(SqList &L)
{
int i=1,n;
cin>>n;
while(i<=n)
{
cin>>L.r[i];
i++;
}
L.length=n;
return OK;
}
void InsertSort(SqList &L)
{
//###### Begin ######
int i,j;
for(i = 2;i <= L.length;i ++ )
if(L.r[i] < L.r[i - 1])
{
L.r[0] = L.r[i];
L.r[i] = L.r[i - 1];
for(j = i - 2;L.r[0] < L.r[j];j -- )
L.r[j + 1] = L.r[j];
L.r[j + 1] = L.r[0];
}
// ###### End ######
}
void ListOut(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
cout<<endl;
}
int main()
{
SqList L;
if(ListCreate(L))
cout<<"创建成功\n";
InsertSort(L);
ListOut(L);
}
第3关:折半插入排序实现
#include <iostream>
using namespace std;
# define MAXSIZE 20 //设记录不超过20个
# define OK 1;
typedef struct { //定义顺序表的结构
int r[MAXSIZE+1]; //存储顺序表的向量 r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
}SqList;
int ListCreate(SqList &L)
{
int i=1,n;
cin>>n;
while(i<=n)
{
cin>>L.r[i];
i++;
}
L.length=n;
return OK;
}
void BInsertSort( SqList &L )
{
//###### Begin ######
int i,j;
for(i = 2;i <= L.length;i ++ )
{
L.r[0] = L.r[i];
int low = 1,high = i - 1;
while(low <= high)
{
int m = low + high >> 1;
if(L.r[0] < L.r[m]) high = m - 1;
else low = m + 1;
}
for(j = i - 1;j >= high + 1;j -- ) L.r[j + 1] = L.r[j];
L.r[high + 1] = L.r[0];
}
// ###### End ######
} // BInsertSort
void ListOut(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
cout<<endl;
}
int main()
{
SqList L;
if(ListCreate(L))
cout<<"创建成功\n";
BInsertSort( L );
ListOut(L);
}