欢迎来到 跌倒的小黄瓜 的博客

♪(^∇^*)我要当大佬,(#^.^#)哈哈哈哈,(。-ω-)zzz我要成为优秀的人,(*^▽^*)٩(๑>◡<๑)۶O(∩_∩)O哈哈~~~~~~~~欢迎━(*`∀´*)ノ亻!

选择排序

链表选择排序

#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);
}
posted @ 2019-12-18 21:27  跌倒的小黄瓜  阅读(272)  评论(0编辑  收藏  举报