算法基础-十大基础排序算法(附代码实现)

算法基础-十大基础排序算法(附代码实现)

1. 插入排序
插入排序的原理是默认前面的元素都是已经排序好的,然后从后面逐个读取插入到前面排序好的合适的位置,就相当于打扑克的时候每获取一张牌的时候就插入到合适的位置一样。插入排序可以分为两种,一种是直接插入还一种是二分法插入,直接插入的原理比较简单,就是往前逐个查找直到找到合适的位置然后插入,二分法插入是先折半查找,找到合适的位置然后再插入。我们先看一下简单的直接插入排序代码:

#include<iostream>
using namespace std;//默认数组前面的元素已经有序(从零开始),而后来的数(从1开始)只是找到正确的位置,然后插入进去,
//要插入的数在数组中的位置就是移动需要的一个空位 
void InsertSort(int nums[],int n){//从小到大的排序 
	for(int i=1;i<n;i++){
		int temp = nums[i];
		int j=i;
		for( ;j>0;j--){
			if(temp<nums[j-1])
				nums[j] = nums[j-1];//把比要插入的元素大的元素,逐位后移 
			else 
				break;	
		}
		nums[j] = temp;
	}
}
int main(){
	int n,*nums;
	cin>>n;
	nums = new int[n];
	for(int i=0;i<n;i++)
		cin>>nums[i];
	InsertSort(nums,n);
	for(int i=0;i<n;i++)
		cout<<nums[i]<<"  ";	
}
 

下面我再来看一下用二分查找来实现插入排序:

#include<iostream>//二分查找插入排序(从小到大) 
using namespace std;
void InsertSort(int nums[],int n){
	for(int i=1;i<n;i++){
		if(nums[i-1]>nums[i]){
			int low = 0;
			int high = i-1;
			int temp = nums[i];
			while(high>=low){
				int mid = (high+low) >> 1;
				if(nums[mid]>temp)
					high = mid - 1;
				else
					low = mid + 1;				
			} 
			for(int j=i;j>low;j--)
				nums[j] = nums[j-1];//后移大值
			nums[low] = temp; 
		}
	}
} 
int main(){
	int n,*nums;
	cin>>n;
	nums = new int[n];
	for(int i=0;i<n;i++)
		cin>>nums[i];
	InsertSort(nums,n);
	for(int i=0;i<n;i++)
		cout<<nums[i]<<"  ";
}

2. 快速排序
快速排序原理是首先要找到一个中枢,把小于中枢的值放到他前面,大于中枢的值放到他的右边,然后再以此方法对这两部分数据分别进行快速排序。先看一下代码:

#include<iostream>//升序排列
using namespace std;
int partition(int num[],int start,int end){
	int left=start;
	int right = end;
	int pivot = num[start];
	while(left<right){
		while((right>left)&&(num[right])>=pivot)//右边找小的 
			right--;
		num[left]=num[right];
		while((left<right)&&num[left]<=pivot)//从左边找大的 
			left++;
		num[right]=num[left];
	}
	num[left]=pivot;//把中枢值放在它应该在的地方
	return left;	
}
void quickSort(int num[],int start,int end){
	if(end>start){
		int split = partition(num,start,end);
		quickSort(num,start,split-1);
		quickSort(num,split+1,end);	
	}
}
int main(){
	int num[11]={6,5,3,8,1,9,4,45,36,32,11};
	//int num[11] = {0,1,2,3,4,5,6,7,8,9,10}; 
	quickSort(num,0,10);
	for(int i=0;i<=10;i++)
		cout<<num[i]<<"  ";
	return 0;	
} 

这里是先用待排数组的第一个作为中枢,把数组划分两部分,小于他的往前挪,那大于他的自然就在后面了,然后再把中枢值放到大于和小于他之间的位置。
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值