数据结构算法

冒泡排序

void BubbleSort(vector<int> &arr)
{   int n=arr.size();
    for(int i = 0; i < n - 1; i++)
    {
        for(int j = 0; j < n - i - 1; j++)
        {
            if(arr[j] > arr[j+1])
                std::swap(arr[j],arr[j+1]);
        }
    }
}
int main(){
    vector<int> nums={1,2,3,2,2,2,5,4,2};
    BubbleSort(nums);

}

选择排序

void SelectSort( vector<int> & a)
{   
    int length=a.size();
    //对数组a排序,length是数组元素数量
    for( int i = 0; i < length; i++ ) {
        // 找到从i开始到最后一个元素中最小的元素,k存储最小元素的下标.
        int min = a[i];
        for( int j = i + 1; j < length; j++ ) {
            if( a[j] < min )swap(a[j],min);
        }
    }
}
int main(){
    vector<int> nums={1,2,3,2,2,2,5,4,2};
    SelectSort(nums);

}

插入排序

void insertSort(vector<int>  &arr)
{   
    int length=arr.size();
	for (int i = 1; i < length; i++)
	{
		for (int j = i - 1; j >= 0 && arr[j + 1] < arr[j]; j--)
		{
			swap(arr[j], arr[j + 1]);
		}
	}
}
int main(){
    vector<int> nums={1,2,3,2,2,2,5,4,2};
    insertSort(nums);
    int cc=1;
}

快速排序

#include<cstring>
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
using namespace std;
class Solution{
public:
    void quickSort(vector<int> & nums,int left ,int right){
        if(left<right){
            int key=partition(nums,left,right);
            quickSort(nums,left,key-1);
            quickSort(nums,key+1,right);
        }
    }
private:
    int partition(vector<int> &nums,int left,int right){
        int k=left,key=nums[right];
        for(int i=left;i<right;i++){
            if(nums[i]<=key){
                swap(nums[i],nums[k++]);
            }
        }
        swap(nums[k],nums[right]);
        return k;
    }
};

int main(){
    Solution sol;
    vector<int>nums={3,5,7,9,2,3,1,0,7,5,4};
    sol.quickSort(nums,0,10);
    int cc=1;
}

堆排序

参考

#include<cstring>
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<memory>
using namespace std;
struct  Solution{
public:
// 递归方式构建大根堆(len是arr的长度,index是第一个非叶子节点的下标)
    void adjust(vector<int> & array ,int len,int idx){
        int left=2*idx+1;
        int right=2*idx+2;
        int maxIdx=idx;
        if(left<len && array[left]>array[maxIdx]){
            maxIdx=left;
        }
        if(right<len && array[right]>array[maxIdx]){
            maxIdx=right;
        }
        if(maxIdx!=idx){
            swap(array[maxIdx],array[idx]);
            adjust(array,len,maxIdx);
        }
    }
    void heapSort(vector<int> &array,int size){
         // 构建大根堆(从最后一个非叶子节点向上)
        for(int i=size/2-1;i>=0;i--){
            adjust(array,size,i);
        }
        for (int i=size-1;i>=1;i--){
            swap(array[0],array[i]);
            adjust(array,i,0);
        }
    }
private:
};

int main(){
    Solution sol;
    vector<int> arr={4,6,8,5,9};
    sol.heapSort(arr,arr.size());
    int cc=1;
}

插入排序

#include<cstring>
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<memory>
#include<list>
using namespace std;
struct Solution{
    public:
        void insertSort(vector<int> & nums){
            for(int i=1;i<nums.size();i++){
                int key=nums[i];
                int j=i-1;
                while(j>=0 && key<nums[j]){
                    nums[j+1]=nums[j];
                    j--;
                }
                nums[j+1]=key;
            }
        }
};
int main(){
    Solution sol;
    vector<int> nums={4,7,3,8,1,9,10};
    sol.insertSort(nums);
    int cc=1;
}

希尔排序

思路:参考

#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
#include<queue>
#include<map>
#include<unordered_map>
using namespace std;
struct Solution{
    public:
        void xierSort(vector<int> & nums){
            int gap=0;
            int N=nums.size();
            for(gap=N/2;gap>0;gap/=2){
                //插入排序
                for(int i=gap;i<N;i++){
                    int j=i;
                    while(j-gap>=0 && nums[j-gap]>nums[j]){
                        swap(nums[j-gap],nums[j]);
                        j=j-gap;
                    }
                }
            }
        }
};

int main(){
    Solution sol;
    vector<int> nums={8,9,1,7,2,3,5,4,6,0,10};
    sol.xierSort(nums);
    int cc=1;
}

归并排序

思路:参考

#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
#include<queue>
#include<map>
#include<unordered_map>
using namespace std;
struct Solution{
    public:
        void Merge(vector<int>& nums,int low ,int mid,int high){
            int i=low,j=mid+1,k=0;
            vector<int> temp(high-low+1);
            while(i<=mid && j<=high){
                if(nums[i]<=nums[j]){
                    temp[k++]=nums[i++];
                }
                else{
                    temp[k++]=nums[j++];
                }
            }
            while(i<=mid){
                temp[k++]=nums[i++];
            }
            while(j<=high){
                temp[k++]=nums[j++];
            }
            for(int i=low,k=0;i<=high;i++,k++){
                nums[i]=temp[k];
            }
        }
        void MergeSort(vector<int> & nums,int low,int high){
            if(low <high){
                int mid=(low+high)/2;
                MergeSort(nums,low,mid);
                MergeSort(nums,mid+1,high);
                Merge(nums,low ,mid,high);
            }
        
        }
};
int main(){
    Solution sol;
    vector<int> nums={5,1,9,3,7,4,8,6,2,0};
    //减1 对应的最后一个元素的位置
    sol.MergeSort(nums,0,nums.size()-1);
    int cc=1;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值