Fast queue
#include<vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
void quickSort(vector<int>&a,int l,int r)
{
if (l>=r) return;
int i=l,j=r,x=a[l];
while(i<j)
{
while(i<j && a[j]>x) j--;
if(i<j) a[i++]=a[j];
while(i<j && a[i]<x) i++;
if(i<j) a[j--]=a[i];
}
a[i]=x;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
int main()
{
int a[6]={5,3,8,7,2,4};
vector<int> nums(a,a+6);
int len = nums.size();
//快排
for(int k=0;k<len;++k)
{
cout<<nums[k]<<" ";
}cout<<endl;
quickSort(nums,0,len-1);
for(int k=0;k<len;++k)
{
cout<<nums[k]<<" ";
}cout<<endl;
return 0;
}
Merge
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
class Solution {
public:
void MergeSort (int arr [], int low,int high) {
if(low>=high) { return; } // 终止递归的条件,子序列长度为1
int mid = low + (high - low)/2; // 取得序列中间的元素
MergeSort(arr,low,mid); // 对左半边递归
MergeSort(arr,mid+1,high); // 对右半边递归
Merge(arr,low,mid,high); // 合并
}
void Merge(int arr[],int low,int mid,int high){
//low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
int i=low,j=mid+1,k=0; //mid+1为第2有序区第1个元素,j指向第1个元素
int *temp=new int[high-low+1]; //temp数组暂存合并的有序序列
while(i<=mid&&j<=high){
if(arr[i]<=arr[j]) //较小的先存入temp中
temp[k++]=arr[i++];
else
temp[k++]=arr[j++];
}
while(i<=mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
temp[k++]=arr[i++];
while(j<=high)//同上
temp[k++]=arr[j++];
for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
arr[i]=temp[k];
delete []temp;//释放内存,由于指向的是数组,必须用delete []
}
};
int main() {
int a[8] = {7,2,4,7,3,0,6,8};
int n=8;
for (size_t i = 0; i < n; i++) {
cout << a[i] << ' ';}cout << endl;
Solution so;
so.MergeSort(a,0,n-1);
for (size_t i = 0; i < n; i++) {
cout << a[i] << ' ';}cout << endl;
return 0;
}
Heap row
#include<stdio.h>
typedef int ElementType;
int arr1[11]={0,2,87,39,49,34,62,53,6,44,98};
void Swap(int* a,int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void PercDown(int A[], int i, int N)
{
int child;
ElementType Tmp;
for (Tmp = A[i]; 2*i+1 < N; i = child){
child = 2*i+1; //注意数组下标是从0开始的,所以左孩子的求发不是2*i
if (child != N - 1 && A[child + 1] > A[child])
++child; //找到最大的儿子节点
if (Tmp < A[child])
A[i] = A[child];
else
break;
}
A[i] = Tmp;
}
void HeapSort(int A[], int N)
{
int i;
for (i = N / 2; i >= 0; --i)
PercDown(A, i, N); //构造堆
for(i=N-1;i>0;--i)
{
Swap(&A[0],&A[i]); //将最大元素(根)与数组末尾元素交换,从而删除最大元素,重新构造堆
PercDown(A, 0, i);
}
}
void Print(int A[],int N)
{
int i;
for(i=0;i<N;i++)
{
printf(" %d ",A[i]);
}
}
int main()
{
int arr[10]={2,87,39,49,34,62,53,6,44,98};
Print(arr,10);
printf("\n");
HeapSort(arr,10);
Print(arr,10);
printf("\n");
return 0;
}