算法基础-十大基础排序算法(附代码实现)
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;
}
这里是先用待排数组的第一个作为中枢,把数组划分两部分,小于他的往前挪,那大于他的自然就在后面了,然后再把中枢值放到大于和小于他之间的位置。