數據結構 多種內部排序算法的應用

輸入學生數據,每個學生有學號、姓名、成績,無序輸入    按照學生的成績 對學生進行排序 

這裏有8個算法(有空會修改爲9個)

有基於插入的  直接插入排序  二分尋找插入排序  希爾排序

有基於交換的  冒泡排序     快速排序

有基於選擇的  簡單選擇排序  堆排序(樹形選擇排序)

有基於合併的  歸併排序

還有一個可能會因爲關鍵字類型而限制的簡單暴力   桶排序

這些都是基本排序算法原理         其實都不如c++算法庫裏提供的sort好用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
	int NO;
	char name[20];
	int score;
}student;
typedef struct {
	student stu[101];
	int num;
}SqList;

// 直接插入排序 
void straight_insert(SqList* L) {
	for (int i = 2; i <= L->num; i++) {
		L->stu[0] = L->stu[i];
		int j = i - 1;
		while (L->stu[j].score > L->stu[0].score) {
			L->stu[j + 1] = L->stu[j];
			j--;
		}
		L->stu[j + 1] = L->stu[0];
	}
}
// 二分查找插入排序  
void half_search_insert(SqList* L) {
	for (int i = 2; i <= L->num; i++) {
		L->stu[0] = L->stu[i];
		int low = 1, high = L->num, mid;
		while (low <= high) {
			mid = (low + high) / 2;
			if (L->stu[mid].score < L->stu[0].score)
				low = mid + 1;
			else
				high = mid - 1;
		}
		int j = i - 1;
		while (j >= high + 1) {//j >= high + 1  
			L->stu[j + 1] = L->stu[j];
			j--;
		}
		L->stu[high + 1] = L->stu[0];
	}
}

// 希爾排序(多次間隔插入排序) 
// 一次希爾排序 
void shell_insert(SqList* L, int d) {
	for (int i = d + 1; i <= L->num; i++) {
		L->stu[0] = L->stu[i];
		int j = i - d;
		while (L->stu[j].score > L->stu[0].score) {
			L->stu[j + d] = L->stu[j];
			j -= d;
		}
		L->stu[j + d] = L->stu[0];
	}
}
void shell_sort(SqList* L, int a[], int t) {
	for (int i = 0; i < t; i++)
		shell_insert(L, a[i]);
}

//冒泡排序  
void popo_sort(SqList* L) {
	bool flag = true;
	for (int i = 1; i < L->num && flag; i++) {
		flag = false;
		for (int j = 1; j <= L->num - i; j++) {
			if (L->stu[j].score > L->stu[j + 1].score) {
				L->stu[0] = L->stu[j];
				L->stu[j] = L->stu[j + 1];
				L->stu[j + 1] = L->stu[0];
			}
			flag = true;
		}
	}
}

//快速排序  遞歸版  
//單次快排 查找樞軸位置  
//int locate_key(SqList* L, int low, int high) {
//	L->stu[0] = L->stu[low];
//	int key = L->stu[0].score;//樞軸  
//	while (low < high) {
//		while (low < high && L->stu[high].score >= key)
//			high--;
//		L->stu[low] = L->stu[high];
//
//		while (low < high && L->stu[low].score <= key)
//			low++;
//		L->stu[high] = L->stu[low];
//	}
//	L->stu[low] = L->stu[0];
//	return low;//樞軸位置  
//}
int locate_key(SqList* L, int low, int high) {
	L->stu[0] = L->stu[low];
	int key = L->stu[0].score;//樞軸  
	do {
		while (key <= L->stu[high].score && high > low)
			high--;
		if (high > low) {
			L->stu[low] = L->stu[high];
			low++;
		}
		while (L->stu[low].score <= key && high > low)
			low++;
		if (high > low) {
			L->stu[high] = L->stu[low];
			high--;
		}
	} while (low != high);
	L->stu[low] = L->stu[0];
	return low;//樞軸位置  
}
void quick_sort(SqList* L, int low, int high) {
	if (low < high) {
		int loc = locate_key(L, low, high);
		quick_sort(L, low, loc - 1);
		quick_sort(L, loc + 1, high);
	}
}

//簡單選擇排序 
void select_sort(SqList* L) {
	for (int i = 1; i < L->num; i++) {
		int k = i;
		for (int j = i + 1; j <= L->num; j++)
			if (L->stu[j].score < L->stu[k].score)
				k = j;
		L->stu[0] = L->stu[k];
		L->stu[k] = L->stu[i];
		L->stu[i] = L->stu[0];
	}
}

//堆排序(樹形選擇排序) 
//建立大根堆 
void build_heap(SqList* L, int low, int high) {
	student root = L->stu[low];//根 
	for (int j = 2 * low; j <= high; j *= 2) {
		if (j < high&& L->stu[j].score < L->stu[j + 1].score)
			j++;
		if (root.score >= L->stu[j].score)
			break;
		L->stu[low] = L->stu[j];
		low = j;
	}
	L->stu[low] = root;
}
void heap_sort(SqList* L) {
	for (int i = L->num / 2; i > 0; i--)
		build_heap(L, i, L->num);
	for (int i = L->num; i > 1; i--) {
		L->stu[0] = L->stu[1];
		L->stu[1] = L->stu[i];
		L->stu[i] = L->stu[0];

		build_heap(L, 1, i - 1);
	}
}

//歸併排序 
void merge(student sr[], student tr[], int i, int m, int n) {
	//sr[i...m]和 sr[m+1...n]歸併到 tr [i...n]
	int j, k;
	for (j = m + 1, k = i; i <= m && j <= n; k++)
		if (sr[i].score < sr[j].score)
			tr[k] = sr[i++];
		else tr[k] = sr[j++];
	//剩餘的  
	while (i <= m)
		tr[k++] = sr[i++];
	while (j <= n)
		tr[k++] = sr[j++];
}
void msort(student sr[], student tr[], int s, int t) {
	//sr[ s...t]歸併排序到 tr[s...t] 
	if (s == t) tr[s] = sr[s];
	else {
		int m = (s + t) / 2;
		student tr2[100];
		msort(sr, tr2, s, m);
		msort(sr, tr2, m + 1, t);
		merge(tr2, tr, s, m, t);
	}
}
void MergeSort(SqList* L) {
	msort(L->stu, L->stu, 1, L->num);
}
void show(SqList L) {
	for (int i = 1; i <= L.num; i++) {
		printf("%d %c %d\n", L.stu[i].score, L.stu[i].name[0],L.stu[i].NO);
	}
	printf("\n");
}

int main()
{
	SqList L;
	int a[6] = { 3,1,5,7,6,2 };
	L.num = 6;
	for (int i = 1; i <= 6; i++) {
		L.stu[i].score = a[i - 1];
		L.stu[i].name[0] = 'A' + i;
		L.stu[i].NO=1000+i;
	}
	show(L);
	//	straight_insert(&L);

	//	half_search_insert(&L);

	//	int dk[3]={4,2,1};
	//	shell_sort(&L,dk,3);

	//	popo_sort(&L);

	//	quick_sort(&L,1,6);

	//	select_sort(&L);

	//	heap_sort(&L);

	//	MergeSort(&L);
	show(L);

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章