
 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);
}










![[leetcode.4]寻找两个正序数组的中位数 多思考边界](https://img-blog.csdnimg.cn/94684add626840faa7f3c46171f29689.png)
![[附源码]Nodejs计算机毕业设计基于与协同过滤算法的竞赛项目管理Express(程序+LW)](https://img-blog.csdnimg.cn/ff6fa8fe6cb34ea2a44400ef165d5bd0.png)







