数据结构个人总结-排序

直接插入排序

#include<bits/stdc++.h>
using namespace std;
void Insertsort(vector<int>& nums,int n){
    for(int i=2;i<=n;i++){ //默认第一个数字有序
        int j;
        nums[0]=nums[i]; //复制哨兵
        for(j=i-1;nums[j]>nums[0];j--){ //往前查找插入位置,边插边将数字后移
            nums[j+1]=nums[j];
        }
        nums[j+1]=nums[0]; //找到插入位置
    }
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n+1);
    for(int i=1;i<=n;i++) //输入数据
        scanf("%d",&nums[i]);
    Insertsort(nums,n); //插入排序
    for(int i=1;i<=n;i++) //输入数据
        printf("%d ",nums[i]);
}

希尔排序 

#include<bits/stdc++.h>
using namespace std;
void ShellInsert(vector<int>& nums,int n,int d){
    for(int i=d+1;i<=n;i+=d){ //每次增长增量d
        nums[0]=nums[i]; //复制哨兵
        int j;
        //相当于一个变相的直接插入排序(d=1)
        for(j=i-d;j>0&&nums[j]>nums[0];j-=d) //注意要增加判断j>0
            nums[j+d]=nums[j];
        nums[j+d]=nums[0]; //找到插入位置
    }
}
void ShellSort(vector<int>& nums,int n){ //划分子序列
    for(int d=n/2;d>=1;d/=2) //计算增量
        ShellInsert(nums,n,d); //按增量d进行排序
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n+1);
    for(int i=1;i<=n;i++) //输入数据
        scanf("%d",&nums[i]);
    ShellSort(nums,n); //希尔排序,先划分子序列
    for(int i=1;i<=n;i++) //输入数据
        printf("%d ",nums[i]);
}

简单选择排序 

#include<bits/stdc++.h>
using namespace std;
void SelectInsert(vector<int>& nums,int n){
    int minIndex; //保存最小值的下标
    for(int i=0;i<n;i++){ //按从小到大排序,每一次选出以一个最小值
        minIndex=i; //初始赋值为i
        for(int j=i+1;j<n;j++){
            if(nums[j]<nums[minIndex])
                minIndex=j; //更新最小值下标
        }
        swap(nums[minIndex],nums[i]); //将选出来的最下值交换到前面
    }
}

int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n);
    for(int i=0;i<n;i++) //输入数据
        scanf("%d",&nums[i]);
    SelectInsert(nums,n); 
    for(int i=0;i<n;i++) //输入数据
        printf("%d ",nums[i]);
}

堆排序 

#include<bits/stdc++.h>
using namespace std;
void HeapAdjust(vector<int>& nums,int n,int cur){ //对堆进行调整
    nums[0]=nums[cur]; //暂存顶点,对该顶点进行堆调整
    for(int i=2*cur;i<=n;i*=2){ //类似于完全二叉树的性质,跟孩子进行比较
        if(i<n&&nums[i]<nums[i+1]) i++; //从左右孩子中选取较大的那个进行比较
        if(nums[0]>=nums[i]) break; //如果当前顶点符合大跟堆的要求,则无需调整
        else{ //如果自己的我孩子大于自己
            nums[cur]=nums[i]; //与较大的孩子进行交换
            cur=i; //调整后的新孩子堆不一定满足堆的要求,可能需要继续调整
        }
    }
    nums[cur]=nums[0]; //找到最终符合整个堆的调整位置
}

void HeapSort(vector<int>& nums,int n){ //建堆
    for(int i=n/2;i>0;i--){ //先把数组建立成大根堆
        HeapAdjust(nums,n,i);
    }
    for(int i=n;i>1;i--){
        swap(nums[i],nums[1]); //将调整好的堆的最后一个元素与第一个元素交换,即把最大的数排序到最后,代表确定一个数的最终位置
        HeapAdjust(nums,i-1,1); //重新对【1,i-1】的堆进行调整
    }
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n+1);
    for(int i=1;i<=n;i++) //输入数据
        scanf("%d",&nums[i]);
    HeapSort(nums,n); //堆排序
    for(int i=1;i<=n;i++) //输入数据
        printf("%d ",nums[i]);
}

冒泡排序

#include<bits/stdc++.h>
using namespace std;
void BubbleSort(vector<int>& nums,int n){
    for(int i=0;i<n-1;i++){ //一共进行n-1轮排序,前n-1个确定后,最后一个自然就确定了
        for(int j=0;j<n-1;j++){
            if(nums[j]>nums[j+1]) swap(nums[j],nums[j+1]);
        }
    }
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n+1);
    for(int i=0;i<n;i++) //输入数据
        scanf("%d",&nums[i]);
    BubbleSort(nums,n); //冒泡排序
    for(int i=0;i<n;i++) //输入数据
        printf("%d ",nums[i]);
}

快速排序

#include<bits/stdc++.h>
using namespace std;
void QuickSort(vector<int>& nums,int left,int right){ //遵循左闭右闭原则
    if(left>=right) return;
    int pivot=nums[left]; //以区间最左端元素为中轴
    int lcur=left,rcur=right; //确立左右两个指针对区间内元素进行排序交换
    while(lcur<rcur){
        while(lcur<rcur&&nums[rcur]>=pivot) rcur--; //从右边找到一个小于枢轴的元素
        nums[lcur]=nums[rcur]; //将该元素移动到枢轴左边
        while(lcur<rcur&&nums[lcur]<=pivot) lcur++; //从左边找到一个大于枢轴的元素
        nums[rcur]=nums[lcur]; //将该元素移动到枢轴右边
    }
    nums[lcur]=pivot; //将枢轴元素放到最终位置
    QuickSort(nums,left,lcur-1); //递归排序左半部分
    QuickSort(nums,lcur+1,right); //递归排序右半部分
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n+1);
    for(int i=0;i<n;i++) //输入数据
        scanf("%d",&nums[i]);
    QuickSort(nums,0,n-1); //快速排序
    for(int i=0;i<n;i++) //输入数据
        printf("%d ",nums[i]);
}

归并排序

#include<bits/stdc++.h>
using namespace std;
void MergeSort(vector<int>& nums,vector<int>& tempnums,int left,int right){ //遵循左闭右闭原则
    if(left>=right) return;
    int mid=(left+right)/2; //从中间划分子序列
    MergeSort(nums,tempnums,left,mid);
    MergeSort(nums,tempnums,mid+1,right);
    for(int i=left;i<=right;i++) tempnums[i]=nums[i]; //使用辅助数组暂存原数组元素
    int i=left,j=mid+1,cur;
    for(cur=left;i<=mid&&j<=right;cur++){ //开始二路归并
        if(tempnums[i]<=tempnums[j]) nums[cur]=tempnums[i++]; //先放小的元素
        else nums[cur]=tempnums[j++];
    }
    while(i<=mid) nums[cur++]=tempnums[i++]; //如果左半边还有剩余元素
    while(j<=right) nums[cur++]=tempnums[j++]; //如果右半边还有剩余元素
}
int main(){
    int n;
    cin>>n; //表示有n个整数需要参与排序
    vector<int>nums(n);
    vector<int>tempnums(n);
    for(int i=0;i<n;i++) //输入数据
        scanf("%d",&nums[i]);
    MergeSort(nums,tempnums,0,n-1); //冒泡排序
    for(int i=0;i<n;i++) //输入数据
        printf("%d ",nums[i]);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值