水題,主要用於學習快排和堆排。
這些算法都曾經在數據結構的課上接觸過
但是真的要等到自己親手遇到問題的時候 才能明白其作用以及真正的含義。
快排基本上自己可以掌握了 堆排還是需要看書才能寫出來。
堆排的算法中有一點點不理解的。
題目————————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;
}