十大排序算法

快速排序

找基准数,大数放右边,小数放左边,递归排序
从后往前找小数,从前往后找大数

#include<iostream>
#include<vector>
#include<algorithm>

void quicksort(vector<int>&nums,int low,int high){
	int i=low,j=high;
	int temp=nums[low];
	while(i<j){
		while(nums[j]<temp&&i<j) j--;
		if(i<j)
			nums[i++]=nums[j];
		while(nums[i]<temp&&i<j) i++;
		if(i<j)
			nums[j--]=nums[i];
	}
	nums[i]=temp;
	quicksort(nums,low,i-1);
	quicksort(nums,i+1,high);
}
冒泡排序
#include<iostream>
#include<vector>
using namespace std;
void BubbleSort(vector<int>&nums,int n){
	for(int i=0;i<nums.size()-1;i++){
		for(int j=0;j<nums.size()-i-1;j++){
			if(nums[j]>nums[j+1]){
				swap(nums[j],nums[j+1]);
			}
		}
	}
}
选择排序
#include<iostream>
#include<vector>
using namespace std;

void SelectSort(vector<int>&nums,int n){
	for(int i=0;i<n;i++){
		int res=i;
		for(int j=i+1;j<n;j++){
			if(nums[j]<nums[res])
				res=j;
		}
		swap(nums[i],nums[res]);
	}
}
插入排序
#include<iostream>
#include<vector>
using namespace std;

void InsertSort(vector<int>&nums){
	int temp;
	for(int i=0;i<nums.size();i++){
		int j=i+1;
		temp=nums[i];
		while(temp<nums[j]&&j>=0){
			arr[j+1]=arr[j];
			j--;
		}
		arr[j+1]=temp;
	}
}
堆排序

步骤一:建立大根堆–将n个元素组成的无序序列构建一个大根堆,
步骤二:交换堆元素–交换堆尾元素和堆首元素,使堆尾元素为最大元素;
步骤三:重建大根堆–将前n-1个元素组成的无序序列调整为大根堆

#include<iostream>
#include<vector>

void adjust(vector<int>& arr,int len,int index){
	int left=2*index+1;//左孩子节点
	int right=2*index+2;//右孩子结点
	int maxindex=index;
	//判断左右子树结点是否大于当前的非叶子节点,若是,则记录下标
	if(left<len&&arr[left]>arr[maxindex]) maxindex=left;
	if(right<len&&arr[right]>arr[maxindex]) maxindex=right;
	//交换非帖子结点和记录的下标的值
	if(maxindex!=index){
		swap(arr[maxindex],arr[index]);
		//递归调整成大堆
		adjust(arr,len,maxindex);	
	}
}
void heapSort(vector<int>& arr,int size){
	for(int i=size/2-1;i>=0;i--){
		//找到第一个非叶子节点,将其调整成大堆
		adjust(arr,size,i);
	}
	for(int i=0;i<size;i++){
	//
		swap(arr[0],arr[i]);
		adjust(arr,i,0);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值