数据结构中九大排序算法的实现! 🙈

目录

排序算法效率比较

排序方法 平均时间复杂度 最坏情况下的时间复杂度 额外空间复杂度 稳定性
选择排序 O(n^2) O(n^2) O(1) 不稳定
插入排序 O(n^2) O(n^2) O(1) 稳定
冒泡排序 O(n^2) O(n^2) O(1) 稳定
希尔排序 O(n^(32)) O(n^2) O(1) 不稳定
堆排序 O(Nlog2N) O(Nlog2N) O(1) 不稳定
快速排序 O(Nlog2N) O(n^2) O(log2N) 不稳定
归并排序 O(Nlog2N) O(Nlog2N) O(N) 稳定
基数排序 O(D(N+R)) O(D(N+R)) O(N+R) 稳定

选择排序

首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

void select_sort(vector<int>&v){
    for(int i=0;i<v.size();i++){
        int index=i;
        for(int j=i+1;j<v.size();j++){
            if(v[index]>v[j]){
                index=j;
            }
        }
        int temp=v[index];
        v[index]=v[i];
        v[i]=temp;
    }
}

直接插入排序

把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

void insert_sort(vector<int>&v){
    int i,j,k;
    for(i=1;i<v.size();i++){
        for(j=i-1;j>=0;j--){
            if(v[j]<v[i])break;
        }
        if(j!=i-1){
            int temp=v[i];
            for(k=i-1;k>j;k--){
                v[k+1]=v[k];
            }
            v[k+1]=temp;
        }       
    }
}

冒泡排序

依次比较相邻的两个元素,若前面的元素比后面的元素大(如果要从大到小排序可以用‘<’)则交换,知道最后的元素为最大(最小);再继续从头遍历执行相同的操作。像泡泡一样把最大(最小)的元素浮到水面。

void bubblesort(vector<int>&v){
    for(int i=v.size()-1;i>=0;i--){
        for(int j=1;j<=i;j++){
            if(v[j]<v[j-1]){
                int temp=v[j];
                v[j]=v[j-1];
                v[j-1]=temp;
            }
        }
    }
}

希尔排序

希尔排序的本原理是:将待排序的一组元素按一定间隔分为若干个序列,分别进行插入排序。开始时设置的“间隔”较大,在每一轮排序中将间隔逐步减小,直到“间隔”为1,也就是最后一步是进行简单插入排序。

void shell_sort(vector<int>&v){
    int i,j,gap;
    for(gap=v.size()/2;gap>0;gap/=2){   //间隔大小 
        for(i=0;i<gap;i++){ //gap个组 
            for(j=i+gap;j<v.size();j+=gap){
                if(v[j]<v[j-gap]){
                    int temp=v[j];
                    int k=j-gap;
                    while(k>=0&&v[k]>temp){
                        v[k+gap]=v[k];
                        k-=gap;
                    }
                    v[k+gap]=temp;
                }               
            }
        }
    }
}

堆排序

堆排序的思想借助于二叉堆中的最大堆得以实现。首先,将待排序数列抽象为二叉树,并构造出最大堆;然后,依次将最大元素(即根节点元素)与待排序数列的最后一个元素交换(即二叉树最深层最右边的叶子结点元素);每次遍历,刷新最后一个元素的位置(自减1),直至其与首元素相交,即完成排序。

void maxheap_down(vector<int>&v,int start,int end){
    int c=start;
    int l=2*c+1;
    int temp=v[c];
    for(;l<=end;c=l,l=2*l+1){
        if(l<end&&v[l]<v[l+1]){
            l++;
        }
        if(temp>=v[l])break;
        else{
            v[c]=v[l];
            v[l]=temp;
        }
    }
}

void heap_sort(vector<int>&v){
    int i;
    for(i=v.size()/2-1;i>=0;i--){   //建堆
        maxheap_down(v,i,v.size()-1);
    }
    for(i=v.size()-1;i>0;i--){
        int temp=v[0];
        v[0]=v[i];
        v[i]=temp;
        maxheap_down(v,0,i-1);  //调整
    }
}

快速排序

(类似于选择排序的定位思想)选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后,取基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各子序列剩余一个元素时,即排序完成。

void quickSort(vector<int>&v,int begin,int end){
    if(begin>=end-1)return ;
    int L=begin,R=end-1;
    int index=v[L];

    while(L<R){
        while(L<R){
            if(v[R]<index){
                v[L++]=v[R];
                break;
            }
            --R;
        }
        while(L<R){
            if(v[L]>index){
                v[R--]=v[L];
                break;
            }
            ++L;
        }
    }
    v[L]=index;
    quickSort(v,begin,L);
    quickSort(v,R+1,end);
}

完整程序

#include<bits/stdc++.h>
using namespace std;
void bubblesort(vector<int>&v){
    for(int i=v.size()-1;i>=0;i--){
        for(int j=1;j<=i;j++){
            if(v[j]<v[j-1]){
                int temp=v[j];
                v[j]=v[j-1];
                v[j-1]=temp;
            }
        }
    }
}

void select_sort(vector<int>&v){
    for(int i=0;i<v.size();i++){
        int index=i;
        for(int j=i+1;j<v.size();j++){
            if(v[index]>v[j]){
                index=j;
            }
        }
        int temp=v[index];
        v[index]=v[i];
        v[i]=temp;
    }
}

void insert_sort(vector<int>&v){
    int i,j,k;
    for(i=1;i<v.size();i++){
        for(j=i-1;j>=0;j--){
            if(v[j]<v[i])break;
        }
        if(j!=i-1){
            int temp=v[i];
            for(k=i-1;k>j;k--){
                v[k+1]=v[k];
            }
            v[k+1]=temp;
        }       
    }

}

void shell_sort(vector<int>&v){
    int i,j,gap;
    for(gap=v.size()/2;gap>0;gap/=2){   //间隔大小 
        for(i=0;i<gap;i++){ //gap个组 
            for(j=i+gap;j<v.size();j+=gap){
                if(v[j]<v[j-gap]){
                    int temp=v[j];
                    int k=j-gap;
                    while(k>=0&&v[k]>temp){
                        v[k+gap]=v[k];
                        k-=gap;
                    }
                    v[k+gap]=temp;
                }               
            }
        }
    }
}

void maxheap_down(vector<int>&v,int start,int end){
    int c=start;
    int l=2*c+1;
    int temp=v[c];
    for(;l<=end;c=l,l=2*l+1){
        if(l<end&&v[l]<v[l+1]){
            l++;
        }
        if(temp>=v[l])break;
        else{
            v[c]=v[l];
            v[l]=temp;
        }
    }
}

void heap_sort(vector<int>&v){
    int i;
    for(i=v.size()/2-1;i>=0;i--){
        maxheap_down(v,i,v.size()-1);
    }
    for(i=v.size()-1;i>0;i--){
        int temp=v[0];
        v[0]=v[i];
        v[i]=temp;
        maxheap_down(v,0,i-1);
    }
}

void quickSort(vector<int>&v,int begin,int end){
    if(begin>=end-1)return ;
    int L=begin,R=end-1;
    int index=v[L];

    while(L<R){
        while(L<R){
            if(v[R]<index){
                v[L++]=v[R];
                break;
            }
            --R;
        }
        while(L<R){
            if(v[L]>index){
                v[R--]=v[L];
                break;
            }
            ++L;
        }
    }
    v[L]=index;
    quickSort(v,begin,L);
    quickSort(v,R+1,end);
}



int main(){
    int N,val;
    vector<int>v;
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>val;
        v.push_back(val);
    }
//  bubblesort(v);  //冒泡排序
//  select_sort(v); //选择排序
//  insert_sort(v); //插入排序
//  shell_sort(v);  //希尔排序
//  quickSort(v,0,v.size());    //快速排序
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<' ';
    }
    return 0;
}