1. 程式人生 > >氣泡排序(順序表)和簡單選擇排序(單鏈表)

氣泡排序(順序表)和簡單選擇排序(單鏈表)

河南理工大學

16 學年—17學年第 1 學期 資料結構 實驗任務書

專業名稱:              實驗學時:    2    

課程名稱:資料結構      任課教師:  翟海霞     

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

實驗環境:    Visual C++ 6.0                  

實驗八:

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

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

          2. 將氣泡排序再做進一步的優化。如果有100

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

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

#include<stdio.h> 
#include<stdlib.h> 
#define Maxsize 20
typedef struct 
{  
int key;  
}RedType; 
typedef struct 
{ 
RedType r[Maxsize+1];  
int length; 
}SqList;  
void Bubblesort(SqList *L) 
{ 
int i,j,n,change; 
RedType x; 
n=L->length;change=1; 
for(i=0;i<n-1&&change;++i) 
{ 
change=0; 
for(j=0;j<n-i-1;++j) 
if(L->r[j].key>L->r[j+1].key) 
{x=L->r[j];L->r[j]=L->r[j+1];L->r[j+1]=x;change=1; 
}  
} 
} 
typedef struct Node
{
	int date;
	struct Node *next;
}node,*List;
//建立單鏈表 
List creat_list(int n)
{
	int i=0;
	List head,L,temp;
	head=(List)malloc(sizeof(node));
	head->next=NULL;
	temp=head;
	for(;i<n;i++)
	{
		L=(List)malloc(sizeof(node));
	    L->next=NULL;
	    printf("Please input the date:");
	    scanf("%d",&L->date);
	    temp->next=L;
	    temp=L;
	}
	return head;
 } 

List getmin(List L)
{//取得從指標L開始的連結串列中記錄的最小值
List min;
min=L;
while(L->next)
{
	if(min->date>(L->next->date))
	{
		min=L->next;
	}
	L=L->next;
 } 
	return min;//返回較小值的指標 
}  
void selectsort(List head)//簡單選擇排序--單鏈表
{
List j,i=head->next;
int temp;
for(;i->next!=NULL;i=i->next)
{
	j=getmin(i);
	if(i->date!=j->date)
	{
		temp=i->date;
		i->date=j->date;
		j->date=temp;
	}
	}	
}
//輸出單鏈表 
void printf_list(List head)
{
	List p=head->next;
	while(p)
	{
		printf("%3d",p->date);
		p=p->next;
	}
} 
int main() 
{  
List head,temp;
SqList L,*p=&L;  
int i;L.length=10;  
int choose,n;
	printf("————————————排序演算法與比較——————————\n\n");
	printf("操作:\n");
	printf("1.氣泡排序\n");
	printf("2.簡單選擇排序\n");
	printf("0.退出\n");
	choose=-1;
	while(1)
	{
    	printf("請輸入您的操作:");
	    scanf("%d",&choose);
		switch(choose)
	{
		case 1:{
			//printf("請輸入資料個數:");
			//scanf("%d",&n);
			printf("請輸入資料:\n");
			 for(i=0;i<L.length;i++) 
             scanf("%d",&L.r[i].key); 
             printf("原資料:"); 
             for(i=0;i<L.length;i++) 
             printf("%4d",L.r[i].key); 
             Bubblesort(p);  
             printf("\n排序後:");  
             for(i=0;i<L.length;i++)  
             printf("%4d",L.r[i].key);  
             printf("\n"); 			
			
		} break;
		case 2:{
			printf("請輸入元素個數:");
			scanf("%d",&n);
			head=creat_list(n);
			printf_list(head); 
			printf("\n");
			selectsort(head);
			printf_list(head);
			printf("\n");
		}break;
		case 0:exit(0);
	}
	}
	return 0;
}

相關推薦

氣泡排序順序簡單選擇排序單鏈

河南理工大學 16 學年—17學年第 1 學期 資料結構 實驗任務書 專業名稱:              實驗學時:    2     課程名稱:資料結構      任課教師:  翟海霞      實驗題目:     排序演算法實現與比較             實驗環境:    Visual C+

排序演算法1簡單選擇排序排序

1.簡單選擇排序 (1)本質:每一趟從給定待排序序列A[ 1......n ] ,選擇出第i小元素,並和A[i]交換。 程式碼: /************************************************* 演算法:簡單選擇排序(升序) 時間

C語言實現氣泡排序簡單選擇排序

氣泡排序(Bubble Sort)的基本思想為兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序記錄為止。 其時間複雜度為O(n^2)。 簡單選擇排序(Simple Selection Sort)

封裝解構,集合,字典,內建函數簡單選擇排序相關知識及習題

byte efault 練習 索引 list() 運算符 sha pow(x 不存在 封裝 將多個值使用逗號分割,組合在一起本質上,返回一個元組,只是省掉了小括號python特有語法,被很多語言學習和借鑒 解構 把線性結構的元素解開,並順序的賦給其它變量左邊接納的變量數要和

直插,希爾,簡單選擇排序

直插,希爾,和簡單選擇排序   直接插入:直接插入排序是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個新的、記錄數量增1的有序表。 時間複雜度:平均情況O(n^2) 最好情況O(n) 最壞情況O(n^2) 空間複雜度:O(1) 穩定

兩種簡單的陣列排序演算法:氣泡排序直接選擇排序升序

氣泡排序的基本思想是:面對一排資料,先從前往後兩兩比較,如果前一個數比後一個數大就交換兩者的順序,即第一個數和第二個數比,第二個數和第三個數比,……,倒數第二個數和最後一個數比,這樣一輪下來以後最大的數就排到最後;接著把除去最大的數的該組資料進行同樣的操作,直至

多種排序算法的思路簡單代碼的實現

insert i++ 前後端 分享 size quicksort 執行 判斷 clas 就自己簡單的理解了一些排序算法(JAVA)思路和代碼分享給大家:歡迎大家進行交流。 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2

順序建立就地逆置函式

本題要求實現順序表的建立和就地逆置操作函式。L是一個順序表,函式ListCreate_Sq(SqList &L)用於建立一個順序表,函式ListReverse_Sq(SqList &L)

6-72 順序建立就地逆置 10 分

6-72 順序表建立和就地逆置 (10 分) 本題要求實現順序表的建立和就地逆置操作函式。L是一個順序表,函式ListCreate_Sq(SqList &L)用於建立一個順序表,函式ListReverse_Sq(SqList &L)是在不引入輔助陣列的前提

排序演算法選擇排序 —— 簡單選擇排序 排序

1、簡單選擇排序簡單選擇排序思想是:從頭到尾(從後往前也行)遍歷序列,先固定第一個位置的資料,將該位置後面的資料,依次和這個位置的資料進行比較,如果比固定位置的資料大,就交換。這樣,進行一趟排序以後,第一個位置就是最小的數了。然後重複進行,第 2 次遍歷並且比較後,第二個位置

圖演算法 圖的表示鄰接鄰接矩陣拓撲排序

圖的表示 圖有兩種表示方法,分別是鄰接矩陣和鄰接表。這裡以有向圖為例說明。 鄰接矩陣 鄰接矩陣是一個二維陣列A。對於每條邊 (u,v),置A[u][v]等於true;否則,陣列元素為false。 如果邊有一個權,那麼可以置A[u][v]等於該權,而使用一個很大或者很小的權

排序演算法氣泡排序簡單選擇排序,直接插入排序,希爾排序

氣泡排序,簡單選擇排序,直接插入排序是三種複雜度為O(n2)的演算法,希爾排序在特殊增量序列的時候可以獲得複雜度為O(n3/2) 氣泡排序 1、最簡單的排序實現 這裡把每個數和這個數之後的每個數比較,大於就交換位置。 缺點:多出了很多次沒有用的交

順序建立就地逆置 10 分

本題要求實現順序表的建立和就地逆置操作函式。L是一個順序表,函式ListCreate_Sq(SqList &L)用於建立一個順序表,函式ListReverse_Sq(SqList &L)是在不引入輔助陣列的前提下將順序表中的元素進行逆置,如原順序表元素依次為1,2,3,4,則逆置

七大內部排序演算法總結插入排序、希爾排序氣泡排序簡單選擇排序、快速排序、歸併排序、堆排序

寫在前面:         排序是計算機程式設計中的一種重要操作,它的功能是將一個數據元素的任意序列,重新排列成一個按關鍵字有序的序列。因此排序掌握各種排序演算法非常重要。對下面介紹的各個排序,我們假定所有排序的關鍵字都是整數、對傳入函式的引數預設是已經檢查好了的。只

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

實驗題目:     排序演算法實現與比較             實驗環境:    Visual C++ 6.0                     實驗八: 實驗目的和要求:熟悉多種排序演算法,理解每種排序演算法思想,掌握排序演算法的基本設計方法,掌握排序演算法

排序——直接選擇排序簡單選擇排序

無序 代碼 .... 插入排序 相對 方法 import 排序 color 直接選擇排序也稱簡單選擇排序,是一種相對簡單的排序算法,它的基本思想是:從一列數中找出最小的,和第一個交換;剩下的重新找出最小的,和這列數的第二個交換,......一直進行n-1次比較之後,該數列已

算法 簡單選擇排序

簡單選擇排序從左到右依次選取一個值作為默認最大值,依次與其它值比較,如果有值比該值大,那最大值指針改指向該值,一輪比較完成後,如果最大值指針沒有變化,則從下一個值繼續下一輪比較,如果指針有變動,則最新指針位置的數值與初始指針位置數值交換位置。代碼如下:lst1 = [ [1, 8, 9, 5, 6,

集中式SVN分布式Git版本控制系統的簡單比較

ron table targe 特點 相對 tps ble 12px pan 集中式(SVN) 分布式(Git) 是否有中央服務器 有。開發人員需要從中央服務器獲得最新版本的項目然後在本地開發,開發完推送給中央服務器。因此脫離服

SSH框架的多查詢增刪查改 方法一

ips 查詢 href ssh margin blank 麻煩 tle 指點 原創作品,允許轉載,轉載時請務必標明作者信息和聲明本文章==》 http://www.cnblogs.com/zhu520/p/7772823.html 因為最近在做Android 練習

Access的創建管理CorelDRAW課程總結對象的操作管理

存儲 管理工具 完成 core ces 知識 包括 掌握 重要 access總結 access表的是數據庫操作及錄入數據的必要步驟,要用表來存儲數據首先是創建一個表。要創建表首先必須了解access的數據類型、表結構字段屬性等內容。 創建完表還要向其中輸入數據,數據的輸入必