题一:希尔排序
#include<iostream>
#include<vector>
using namespace std;
/*
希尔排序:先将整个待排序分割成若干子序列分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序
本质上希尔排序是对直接插入排序的优化
*/
vector<int> ShellSort(vector<int> str){
int step; //为当前增量
for(step=str.size()/2;step>0;step/=2){
for(int i=step;i<str.size();i++){ //每次比较两个元素的大小,晓得在前,大的在后
int j=i;
int temp=str[j];
if(str[j]<str[j-step]){
while(j-step>=0&&temp<str[j-step]){ //当j-step>=0的时候,则将两元素进行交换
str[j]=str[j-step];
j-=step;
}
str[j]=temp;// 若小于0时,则不进行交换
}
}
}
return str;
}
int main(){
vector<int> str;
int num;
cin>>num;
int temp;
for(int i=0;i<num;i++){ //构建数组
cin>>temp;
str.push_back(temp);
}
str=ShellSort(str);
for(int i=0;i<str.size();i++){
cout<<str[i]<<" ";
}
return 0;
}
题二:快速排序
#include<iostream>
#include<vector>
using namespace std;
/*
快速排序:对冒泡排序算法的一种改进
*/
void quickSort(vector<int> &str,int low,int high){
if(low>high) return;
int temp=str[low]; //相当于基准元素,用于存放待排序元素
int i=low;
int j=high;
while(i<j){
while(temp<=str[j]&&i<j){ //j所指元素大于基准元素,则j向前移动
j--; //寻找比基准元素小的元素
}
while(temp>=str[i]&&i<j){ //i所指元素小于基准元素,则i向后移动
i++; //寻找比基准元素大的元素
}
if(i<j){ //交换i,j所指的两元素,晓得在前,大的在后
int number=str[i];
str[i]=str[j];
str[j]=number;
}
}
//当i==j的时候退出循环,此时i,j所指位置则为temp的最终存放位置
str[low]=str[i];
str[i]=temp;
//快速排序就是递归
quickSort(str,low,i-1);
quickSort(str,i+1,high);
}
int main(){
vector<int> str;
int num;
cin>>num;
int temp;
for(int i=0;i<num;i++){ //构建数组
cin>>temp;
str.push_back(temp);
}
quickSort(str,0,str.size()-1);
for(int i=0;i<str.size();i++){
cout<<str[i]<<" ";
}
return 0;
}
题三:归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
#include<iostream>
#include<vector>
using namespace std;
/*
归并排序基本思想:
将初始待排序序列的n个记录两两二路归并,从而得到n/2个有序子序列;
在对n/2个有序子序列进行两两二路归并,,,,,直至得到长度为n的有序序列为止
*/
//两路归并算法
void merge(vector<int> &str,int begin,int mid,int end,vector<int> t) {
int i=begin;
int j=mid+1;
int temp=0; //指向辅助数组的元素
while(i<=mid&&j<=end){ //两侧都有元素
//将较小的元素放入辅助数组
if(str[i]<=str[j]){
t[temp++]=str[i++];
}
else{
t[temp++]=str[j++];
}
}
//左侧还有元素
while(i<=mid){
t[temp++]=str[i++];
}
//右侧还有元素
while(j<=end){
t[temp++]=str[j++];
}
//将辅助数组中的元素赋值到原属组中
temp=0;
int l=begin;
while(l<=end){
str[l]=t[temp];
temp++;
l++;
}
}
void mergeSort(vector<int> &str,int begin,int end,vector<int> t){
if(begin<end){ //当子序列只有一个元素时结束递归
int mid=(begin+end)/2; //划分子序列
mergeSort(str,begin,mid,t);//对子序列左侧进行排序
mergeSort(str,mid+1,end,t); //对右侧进行排序
merge(str,begin,mid,end,t);
}
}
int main(){
vector<int> str;
vector<int> t;
int num;
cin>>num;
int temp;
for(int i=0;i<num;i++){ //构建数组
cin>>temp;
str.push_back(temp);
}
mergeSort(str,0,str.size()-1,t);
for(int i=0;i<str.size();i++){
cout<<str[i]<<" ";
}
return 0;
}