7-1 快速排序
作者 朱允刚
单位 吉林大学
给定包含n个元素的整型数组a[1],a[2],…,a[n],利用快速排序算法对其进行递增排序,请输出排序过程,即每次Partition之后的数组。每次选择所处理的子数组的第一个元素作为基准元素。
输入格式:
输入为两行,第一行为一个整数n(1<n≤1000),表示数组长度。第二行为n个空格间隔的整数,表示待排序的数组。
输出格式:
输出为若干行,每行依次输出Partition后的数组,每个元素后一个空格。
输入样例:
5
4 5 3 2 1
输出样例:
2 1 3 4 5
1 2 3 4 5
1 2 3 4 5
#include<iostream>
using namespace std;
int array[1005],n;
void print(){
for(int i=1;i<=n;++i){
cout<<array[i]<<" ";
}
putchar('\n');
}
void swap(int &a,int &b){
int mid=a;
a=b;
b=mid;
}
int Partition(int array[],int left,int right){
int location=left;
array[0]=array[left];
while(left<right){
while(left<right&&array[right]>array[0]) --right;
while(left<right&&array[left]<=array[0]) ++left;
swap(array[right],array[left]);
}
array[location]=array[left];
array[left]=array[0];
return left;
}
void quicksort(int array[],int left,int right){
if(left<right){
int position=Partition(array,left,right);
print();
quicksort(array,left,position-1);
quicksort(array,position+1,right);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i){
cin>>array[i];
}
quicksort(array,1,n);
print();
return 0;
}
7-2 堆排序
作者 严华云
单位 湖州师范学院
对n个数,要求用堆排序(最大堆)对其进行排序。
输入格式:
第一行一个n(n<1000)。第二行给出n个数。
输出格式:
输出n行,每行n个数。第一行表示将n个数(将n个数看成一棵树)变成最大堆后的结果,第二行表示将上次结果的根节点交换到现有节点的最后一个节点(然后将除最后一个节点的数看成一颗树),然后将该剩余节点树从新变成最大堆后的结果输出(包括交换到最后的节点),依次类推。
输入样例:
6
7 1 6 4 3 5
输出样例:
7 4 6 1 3 5
6 4 5 1 3 7
5 4 3 1 6 7
4 1 3 5 6 7
3 1 4 5 6 7
1 3 4 5 6 7
#include<bits/stdc++.h>
using namespace std;
int n,x;
void print(vector<int>& nums){
for(int i=0;i<nums.size();++i){
cout<<nums[i]<<" ";
}
putchar('\n');
}
void maxHeapify(vector<int>& nums, int i, int len) {
for (; (i << 1) + 1 <= len;) {
int lson = (i << 1) + 1;
int rson = (i << 1) + 2;
int large;
if (lson <= len && nums[lson] > nums[i]) {
large = lson;
} else {
large = i;
}
if (rson <= len && nums[rson] > nums[large]) {
large = rson;
}
if (large != i) {
swap(nums[i], nums[large]);
i = large;
} else {
break;
}
}
}
void buildMaxHeap(vector<int>& nums, int len) {
for (int i = len / 2; i >= 0; --i) {
maxHeapify(nums, i, len);
}
}
void heapSort(vector<int>& nums) {
int len = (int)nums.size() - 1;
buildMaxHeap(nums, len);
print(nums);
for (int i = len; i >= 1; --i) {
swap(nums[i], nums[0]);
len -= 1;
maxHeapify(nums, 0, len);
print(nums);
}
}
int main(){
cin>>n;
vector<int> nums(n);
for(int i=0;i<n;++i){
cin>>x;
nums[i]=x;
}
heapSort(nums);
}