面试常见排序算法实现

1.快速排序

//快速排序
void quick_sort(vector<int> &nums)
{
    quick_sort(nums,0,nums.size()-1);
    return;
}

void quick_sort(vector<int> &nums,int start,int end)
{
    //元素<=2个退出
    if(start >= end)
        return;
    if(start +1 == end){
        if(nums[start]>nums[end])
            swap(nums[start],nums[end]);
        return;
    }

    //分治
    int pos = partition(nums,start,end);

    //递归
    quick_sort(nums,start,pos-1);
    quick_sort(nums,pos+1, end);

    return ;
}

int partition(vector<int> &nums,int start,int end)
{
    int key;
    int l,r;

    key = nums[end];
    l = start;
    r = end;

    while(l<r){
        //循环顺序不能颠倒,先从左边开始循环,保证最后循环终止的时候,指针停在>=key的值上,方便与nums[end]交换
        while(l<r && nums[l]< key)
            l++;
        while(l<r && nums[r]>=key)
            r--;
        swap(nums[l],nums[r]);
    }

    swap(nums[l],nums[end]);

    return l;
}

 

2.归并排序

//归并排序
void merge_sort(vector<int> &nums)
{
    vector<int> tmp(nums.size(),0);
    merge_sort(nums,tmp,0,nums.size()-1);
}

void merge_sort(vector<int> &nums,vector<int> &tmp,int start ,int end)
{
    //元素个数<=2递归终止
    if(start >= end)
        return;
    if(start +1 == end){
        if(nums[start] >nums[end])
            swap(nums[start],nums[end]);
        return ;
    }

    int mid,l,r,mer;

    mid = (start+end)/2;
    //递归
    merge_sort(nums,tmp,start,mid);
    merge_sort(nums,tmp,mid+1,end);

    //合并至临时空间
    l = start;
    r = mid+1;
    mer = start;

    while(l<=mid && r<=end){
        if(nums[l] < nums[r])
            tmp[mer++] = nums[l++];
        else 
            tmp[mer++] = nums[r++];
    }
    while(l<=mid)
        tmp[mer++] = nums[l++];
    while(r<=end)
        tmp[mer++] = nums[r++];

    //复制回原数组
    for(int i = start;i<=end;i++)
        nums[i] = tmp[i];

    return ;
}

3.堆排序

//堆排序
void heap_sort(vector<int> &nums)
{
    
    //自底向上建堆
    for(int i = nums.size()/2;i<nums.size();i++){
        adjust(nums,nums.size(),i);
    }

    //就地排序
    for(int i = nums.size()-1;i>0;i--){
        swap(nums[0],nums[i]);
        adjust(nums,i,0);
    }
    
    return;   
}
//调整函数,将x下标对应的元素做下沉调整
void adjust(vector<int> &nums,int len,int x)
{
    int l,r;

    while(x<len){
        l = x*2+1;
        r = x*2+2;
        if(r<len && nums[r]>nums[x] && nums[r] > nums[l]){
            swap(nums[r],nums[x]);
            x = r;
            continue;
        }
        if(l<len && nums[l]>nums[x]){
            swap(nums[l],nums[x]);
            x = l;
            continue;
        }
        return ;
    }
    return ;
}





 

点赞