1. 程式人生 > >資料結構 排序(氣泡排序改進,簡單選擇排序連結串列實現)

資料結構 排序(氣泡排序改進,簡單選擇排序連結串列實現)

實驗題目:     排序演算法實現與比較            

實驗環境:    Visual C++ 6.0                    

實驗八:

實驗目的和要求:熟悉多種排序演算法,理解每種排序演算法思想,掌握排序演算法的基本設計方法,掌握排序演算法時間複雜度和空間複雜度的分析方法。

實驗內容:1.對所講過演算法深入理解。

          2. 將氣泡排序再做進一步的優化。如果有100個數的陣列,當前僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在該一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的資料必定已經有序了,記錄下這位置,下次只要從陣列頭部遍歷到這個位置就可以了。

           3. 試以單鏈表為儲存結構,實現簡單選擇排序演算法。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define MAXSIZE 20
using namespace  std;
typedef struct
{
    int key;
    char *otherinfor;
}ElemType;
typedef struct
{
	ElemType *r;
	int length;
}SqList;
void BubbleSort(SqList &L)//氣泡排序 
{
	int c,i,m=L.length;
	ElemType t;
	while(m>0)
	{
		for(c=0,i=1;i<m;i++)
		{
			if(L.r[i].key>L.r[i+1].key)
			{
				t=L.r[i];
				L.r[i]=L.r[i+1];
				L.r[i+1]=t;
				c=i;
			}
		} 
		m=c;
	}
}
void CreatSqList(SqList &L)
{
	int i,n;
	printf("請輸入資料個數(<MAXSIZE)\n");
	scanf("%d",&n);
	printf("請輸入待排序的序列\n");
	for(i=1;i<=n;i++)
	{
		scanf("%d",&L.r[i].key);
		L.length++; 
	}
}
void ShowSqList(SqList L)
{
	int i;
	for(i=1;i<=L.length;i++)
	{
		cout<<L.r[i].key<<endl;
	}
	printf("\n");
}
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;
void InitList(LinkList &L)
{
	L=(LNode*)malloc(sizeof(LNode));
	L->next=NULL;
}
void IntPut(LinkList &L,int m)
{
	int i;
	LinkList r,p;
	r=L;
	for(i=0;i<m;i++)
	{
		p=(LNode*)malloc(sizeof(LNode));
		cin>>p->data;
		p->next=NULL;
		r->next=p;
		r=p;
	}
}
void OutPut(LinkList &L)
{
	LinkList p;
	p=(LNode*)malloc(sizeof(LNode));
	p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next; 
	 } 
}
void SelectSort(LinkList &L)//簡單選擇排序 
{
	LinkList r,q,p=L->next;
	int t; 
	while(p)
	{
		q=p->next;
		r=p;
		while(q)
		{
			if(q->data<r->data)
			    r=q;	
			q=q->next;
		}
		if(r!=p)
		{
			t=r->data;
			r->data=p->data;
			p->data=t;
		}
		p=p->next;
	} 
}
int main()
{
	SqList L;
	LinkList Q;
	int m;
	L.r=(ElemType*)malloc(sizeof(ElemType));
	L.length=0;
	CreatSqList (L);
	BubbleSort(L);
	ShowSqList(L);
	printf("請輸入需要排序的數的個數\n");
    scanf("%d",&m);
	InitList(Q);
    IntPut(Q,m);
    SelectSort(Q);
    OutPut(Q);
}