(0)从终端读入数字并存储到list中的代码:
#include<iostream>
#include<vector>
#include<sstream>
#include<string>
using namespace std;
int main(){
vector<int> data_list;
string line;
getline(std::cin,line);
istringstream iss(line);
for(int d;iss>>d;data_list.push_back(d)){;}
return 1;
}
(1)插入排序
思路:将后面的值依次插入前面的有序序列中,需要保持前面的序列始终有序,而在只有一个元素的时候自然保持有序。
特点:在比较的过程中交换
void insert_sort(vector<int> & data_list){
if(data_list.size()==1){
return;
}
for(int i=1;i<data_list.size();i++){
for(int j=i;data_list[j]<data_list[j-1]&&j>0;j--){
int temp=data_list[j];
data_list[j]=data_list[j-1];
data_list[j-1]=temp;
}
}
}
(2)希尔排序
在插入排序的基础上进行改进,增大移动的增量,实现快速的移动,一种有增量的插入排序
void shell_sort(vector<int> & data_list){
// 构建增量序列
int N=data_list.size();
int h=1;
while(h<N/3) h=h*3+1;
//有增量的插入排序
while(h>=1){
for(int i=h;i<N;i++){
for(int j=i;j>=h && data_list[j]<data_list[j-h];j=j-h){
int temp=data_list[j];
data_list[j]=data_list[j-h];
data_list[j-h]=temp;
}
}
h=h/3;
}
}
(3)快速排序:对序列进行切分,使得切分元素左侧的元素都比它小,而右侧的元素都比他大,递归不断切分后返回,使得最终的序列有序,开始时应先shuffle一下序列。
int partition(vector<int> & data_list, int low, int high){
int i=low;
int j=high+1; //注意起始指针的位置
int cmp_element=data_list[low];
while(1){
while(data_list[++i]<cmp_element){if(i==high) break;}
while(data_list[--j]>cmp_element){if(j==low) break;}//这条判断可以不写
if(i>=j){break;} //判断是否有指针交叉
int temp=data_list[j];
data_list[j]=data_list[i];
data_list[i]=temp;//交换元素
}
//将切分元素移动到指定的位置
data_list[low]=data_list[j];
data_list[j]=cmp_element;
return j;//返回切分元素位置
}
void quick_sort(vector<int> &data_list, int low,int high){
if(low>=high){
return;//递归退出条件,只有一个元素
}
int j=partition(data_list,low,high);
quick_sort(data_list,low,j-1);
quick_sort(data_list,j+1,high);
}
void Sort(vector<int> &data_list){
int low=0;
int high=data_list.size()-1;
quick_sort(data_list,low,high);
}