#include<vector>
#include<iostream>
using namespace std;
//从小到大排序
//冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来
void bubble_sort(vector<int> &nums){ //要传递的是引用
for(int i=0;i<nums.size();i++){
for(int j=0;j<nums.size()-i-1;j++){
if(nums[j]>nums[j+1]){
swap(nums[j],nums[j+1]); //C++的库中就有这个函数:swap(a,b)
}
}
}
}
//选择排序:和冒泡排序一样,也是要选着走一遍,但是不需要一直交换,最后放到相应的位置即可
void select_sort(vector<int> &nums){
if(nums.size()==0) return;
for(int i=0;i<nums.size();i++){
int min=i;
for(int j=i+1;j<nums.size();j++){
if(nums[j]<nums[min]){
min=j;
}
}
swap(nums[i],nums[min]);
}
}
//插入排序
//将一个数插入到已经排好序的序列中
//从小到大排序
void insert_sort(vector<int> &nums){
if(nums.size()==0) return;
for(int i=1;i<nums.size();i++){
for(int j=i;j>0;j--){
if(nums[j-1]>nums[j]){
swap(nums[j-1],nums[j]);
}
}
}
}
//希尔排序
//也就是 分组插入排序
void shell_sort(vector<int> &nums){
if(nums.size()==0) return;
for(int gap=nums.size()/2;gap>0;gap=gap/2){
for(int i=gap;i<nums.size();i+=gap){ //插入排序
for(int j=i;j>0;j-=gap){
if(nums[j-gap]>nums[j]){
swap(nums[j-gap],nums[j]);
}
}
}
}
}
//归并排序 分治的思想
void msort(vector<int>& nums,int begin,int end){
if(begin>=end) return;
int mid=(begin+end)/2;
msort(nums,begin,mid);
msort(nums,mid+1,end);
vector<int> temp;
int i,j;
for(i=begin,j=mid+1;i<=mid&&j<=end;){
if(nums[i]<nums[j]){
temp.push_back(nums[i]);
i++;
}
else{
temp.push_back(nums[j]);
j++;
}
}
while(i<=mid){
temp.push_back(nums[i]);
++i;
}
while(j<=end){
temp.push_back(nums[j]);
++j;
}
for(int k=0,l=begin;k<temp.size();k++,l++){
nums[l]=temp[k];
}
}
void merge_sort(vector<int> &nums){
msort(nums,0,nums.size()-1);
}
//快速排序
//对冒泡排序的改进
//通过一趟排序将要排序的数据分割成独立的两部分,\
其中一部分的所有数据都比另外一部分的所有数据都要小,\
然后再按此方法对这两部分数据分别进行快速排序,整个排序过\
程可以递归进行,以此达到整个数据变成有序序列。
int partation(vector<int> &nums,int begin,int end){
int low=begin;
int high=end;
int temp=nums[low];
while(low<high){
while(low<high&&nums[high]>=temp){
high--;
}
nums[low]=nums[high];
while(low<high&&nums[low]<=temp){
low++;
}
nums[high]=nums[low];
}
nums[high]=temp; //跳出循环的时候high和low是一样的了
//cout<<high<<endl;
return high;
}
void qsort(vector<int> &nums,int begin,int end){
if(begin<end){ //不要忘记设置跳出循环的条件
int p=partation(nums,begin,end);
qsort(nums,begin,p);
qsort(nums,p+1,end);
}
}
void quick_sort(vector<int> &nums){
qsort(nums,0,nums.size()-1);
}
//堆排序
//将树层序遍历,从0开始,编号为i的节点的子节点为2i+1,2i+2
//升序建立大顶堆,降序建立小顶堆
void adjust(vector<int> &nums,int i,int length){ //调整堆
int temp=nums[i];
for(int k=2*i+1;k<length;k=2*k+1){
if(k+1<length&&nums[k]<nums[k+1]) k++;
if(nums[k]>temp){ //temp是要挪动的数
nums[i]=nums[k];
i=k;
}else{
break;
}
}
nums[i]=temp;
}
void heap_sort(vector<int> &nums){
for(int i=nums.size()/2-1;i>=0;i--){
adjust(nums,i,nums.size());
}
for(int j=nums.size()-1;j>0;j--){
swap(nums[0],nums[j]);
adjust(nums,0,j);
}
}
int main(){
int a[10]={4,3,5,-1,8,10,45,2,5,67};
vector<int> nums(a,a+10); //可以这样初始化数组
//bubble_sort(nums);
//select_sort(nums);
//insert_sort(nums);
//merge_sort(nums);
//shell_sort(nums);
//quick_sort(nums);
heap_sort(nums);
for(int i=0;i<10;i++){
cout<<nums[i]<<endl;
}
}