排序算法练习(快排&&堆排)——hdu 1040

水题,主要用于学习快排和堆排。

这些算法都曾经在数据结构的课上接触过

但是真的要等到自己亲手遇到问题的时候 才能明白其作用以及真正的含义。

快排基本上自己可以掌握了 堆排还是需要看书才能写出来。

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


题目————————hdu 1040


AC代码:

快排

#include
#include
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 (ix){
				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
#include
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;
}




你可能感兴趣的:(hdu)