Quick sort + merge + heap sort

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

 

 

Guess you like

Origin blog.csdn.net/hbhhhxs/article/details/107527570