排序算法練習(快排&&堆排)——hdu 1040

水題,主要用於學習快排和堆排。

這些算法都曾經在數據結構的課上接觸過

但是真的要等到自己親手遇到問題的時候 才能明白其作用以及真正的含義。

快排基本上自己可以掌握了 堆排還是需要看書才能寫出來。

堆排的算法中有一點點不理解的。


題目————————hdu 1040


AC代碼:

快排

#include<iostream>
#include<cstdio>
using namespace std;

/*
快排
*/

int a[1002];

void quicksort(int a[], int l, int r){
	if (l < r){
		int i, j, x;
		i = l;
		j = r;
		x = a[i];
		while (i < j){
			while (i<j&&a[j]>x){
				j--;   //從右向左找第一個小於x的數
			}
			if (i < j){
				a[i++] = a[j];
			}
			while (i < j&&a[i] < x){
				i++;  //從左向右找第一個大於x的數
			}
			if (i < j){
				a[j--] = a[i];
			}
		}
		a[i] = x;
		quicksort(a, l, i - 1);
		quicksort(a, i + 1, r);
	}
}

int main(){
//	freopen("TestDate.txt", "r", stdin);

	int n,tnum,i;
	cin >> n;
	while (n--){
		cin >> tnum;
		for (i = 0; i < tnum; i++)
			cin >> a[i];
		quicksort(a,0,tnum-1);
		for (i = 0; i < tnum; i++){
			cout << a[i];
			if (i + 1 != tnum){
				cout << " ";
			}
			else{
				cout << endl;
			}
		}
	}
	return 0;
}

堆排

#include<iostream>
#include<cstdio>
using namespace std;

int a[1002];

void heap_down(int a[], int start, int end){
	int c = start;
	int l = 2 * c + 1;
	int tmp = a[c];
	for (; l <= end; c = l, l = 2 * l + 1){
		if (l < end&&a[l] < a[l + 1]){
			l++;
		}
		if (tmp >= a[l]){
			break;
		}
		else{
			a[c] = a[l];
			a[l] = tmp;
		}
	}
}

void swap(int *a, int *b){
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}

void heap_sort_asc(int a[], int n){
	int i;
	for (i = n / 2 - 1; i >= 0; i--){
		heap_down(a, i, n - 1);
	}
	for (i = n - 1; i > 0; i--){
		swap(&a[0], &a[i]);
		heap_down(a, 0, i - 1);
	}
}

int main(){
	freopen("TestDate.txt", "r", stdin);
	int n, tnum, i;
	cin >> n;
	while (n--){
		cin >> tnum;
		for (i = 0; i < tnum; i++)
			cin >> a[i];
		heap_sort_asc(a, tnum);
		for (i = 0; i < tnum; i++){
			cout << a[i];
			if (i + 1 != tnum){
				cout << " ";
			}
			else{
				cout << endl;
			}
		}
	}
	return 0;
}




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