简单排序记忆

1.冒泡排序

void Bubble(vector<int>& arr)
{
    for(int i=0;i<arr.size()-1;i++){                   0      len-1
        for(int j=0;j<arr.size()-i-1;j++){             0      len-1-i
            if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]);        j>j+1
        }
    }
}

0    len-1    

0    len-1-i

  j>j+1

 2.选择排序

void selectionSort(vector<int>& arr)
{
    for(int i=0;i<arr.size()-1;i++){                     0    len-1
        int min_index=i;
        for(int j=i+1;j<arr.size();j++){                 i+1   len
            if(arr[j]<arr[min_index]) min_index=j;
        }
        swap(arr[i],arr[min_index]);
    }
}

  3.插入排序

void insertionSort(vector<int>& arr)
{
    for(int i=0;i<arr.size();i++){                 
        int next_index=i+1;                                 上一堆以及排好了又来一个
        while((next_index<arr.size())&&(arr[next_index-1]>arr[next_index]))
        {
            swap(arr[next_index-1],arr[next_index]);
            next_index--;                                   
        }
    }
}

 4.快速排序

#include<iostream>
#include<vector>
using namespace std;
int res[2];
void partition(vector<int>& arr,int left,int right)           //分组问题荷兰国旗
{
    int p1=left-1,p2=right+1,index=left,target=arr[right];
    while(index<p2)                                           //不碰右边界
    {
        if(arr[index]<target) swap(arr[index++],arr[++p1]);   
        else if(arr[index]>target) swap(arr[index],arr[--p2]); //向右交换还得判断要不要向左
        else index++;
    }
    res[0]=p1+1;
    res[1]=p2-1;
}
void process(vector<int>& arr,int left,int right)
{
    if(left<right){
    swap(arr[right],arr[(rand()%(right-left))+1+left]);    //(left,right]
    partition(arr,left,right);
    process(arr,left,res[0]-1);
    process(arr,res[1]+1,right);
    }
}

int main()
{
    int a;
    cin>>a;
    vector<int> arr(a);
    int up_down=0;
    for(int &b:arr) cin>>b;
    cin>>up_down;
    int p1=0,p2=arr.size()-1;  //>=区最右端最初是-1
    //process(arr,p1, p2);
    insertionSort(arr);
    if(!up_down){
     for(int i=0;i<a;i++)
        cout<<arr[i]<<" ";
    }
    else{
     for(int i=0;i<a;i++)
        cout<<arr[a-1-i]<<" ";
    }
    return 0;
}

5.堆排序 

void heapify(vector<int>& arr,int index,int heapsize)
{
    int left=index*2+1;
    while(left<heapsize)
    {
        int largest=left+1<heapsize&&arr[left+1]>arr[left]?left+1:left;
        if(arr[largest]<=arr[index]) break;
        swap(arr[largest],arr[index]);
        index=largest;
        left=index*2+1;
    }
}
int main()
{
    int a;
    cin>>a;
    vector<int> arr(a);
    int up_down=0;
    for(int &b:arr) cin>>b;
    cin>>up_down; 
    int heapsize = arr.size();
    for(int i=heapsize-1;i>=0;i--)  heapify(arr,i,heapsize);
//从右到左len-1到0,只改变下标index
    while(heapsize>0)        
    {
        swap(arr[0],arr[--heapsize]);
        heapify(arr,0,heapsize);
    }
//判断条件heapsize>0 变化--heapsize
    if(!up_down){
     for(int i=0;i<a;i++)
        cout<<arr[i]<<" ";
    }
    else{
     for(int i=0;i<a;i++)
        cout<<arr[a-1-i]<<" ";
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值