1.插入排序
//插入排序
void f(vector<int> &a){
int i,j;
for(i=1;i<a.size();++i){
int temp=a[i];
for(j=i;j>0;j--)
if(a[j-1]>temp)//如果前面的数值大于temp,则后移。
a[j]=a[j-1];
else
break;//跳出
a[j]=temp;//将temp插入合适的位置
}
}
//冒泡排序
//1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
//2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
//3.N=N-1,如果N不为0就重复前面二步,否则排序完成
void bubble_sort(vector<int> &a){
int l=a.size();
if(l<2)
return;
int i,j;
for(i=0;i<l;++i){
for(j=1;j<l-i;++j){//l-i(每次内循环后都将每次的最大值放在l-i-1的位置上)
if(a[j]<a[j-1]){//相邻元素比较,交换冒泡
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}
//选择排序
void selectSort(vector<int> &a){
int l=a.size();
if(l<2)
return;
int i,j,d;
for(i=0;i<l;++i){
d=i;
for(j=i+1;j<l;++j){
if(a[i]>a[j])
d=j;//记录每次内循环的最小值的位置
}
int temp=a[d];
a[d]=a[i];
a[i]=temp;
}
}
//归并排序
void mergesort(vector<int> &a, vector<int> &temp, int left, int right){
void merge(vector<int> &a, vector<int> &temp, int leftbegin, int rightbegin, int rightend);
if(left<right){
int center=(left+right)>>1;
mergesort(a, temp, left, center);
mergesort(a, temp, center+1, right);//先对两半各自排序,再把两半合并
merge(a, temp, left, center+1, right);
}
}
void merge(vector<int> &a, vector<int> &temp, int leftbegin, int rightbegin, int rightend){
int leftend=rightbegin-1;
int i=leftbegin,j=rightbegin,k=leftbegin;
while(i<=leftend && j<=rightend)
if(a[i]<=a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
while(i<=leftend)
temp[k++]=a[i++];
while(j<=rightend)
temp[k++]=a[j++];
for(i=leftbegin;i<=rightend;++i)//临时数组中元素的位置和实际数组一一对应,依次拷贝回去
a[i]=temp[i];
}
5.快速排序
void swap(int &a, int &b){
int temp=a;
a=b;
b=temp;
}
int Median3(vector<int> &a, int left, int right){//三数中值分割法
int center=(left+right)>>1;
if(a[left]>a[center])
swap(a[left], a[center]);
if(a[left]>a[right])
swap(a[right], a[left]);//a[left]最小
if(a[center]>a[right])
swap(a[right], a[center]);//a[left]<=a[center]<=a[right]
swap(a[center], a[right-1]);
return a[right-1];//将中值放在倒数第二个位置
}
void sort(vector<int> &a, int left, int right){//当元素的个数等于3时,直接排序
int center=(left+right)>>1;
if(a[left]>a[center])
swap(a[left], a[center]);
if(a[left]>a[right])
swap(a[right], a[left]);//a[left]最小
if(a[center]>a[right])
swap(a[right], a[center]);
}
void qsort(vector<int> &a, int left, int right){
if(left+3<=right){//数组元素的个数大于3时,至少为4
int temp=Median3(a, left, right);
int i=left, j=right-2;
while(i<j){
while(a[i]<temp)
++i;
while(a[j]>temp)
--j;
swap(a[i],a[j]);
}
swap(a[i],a[right-1]);//将中值放回合适的位置,作为分割点
qsort(a, left, i-1);
qsort(a, i+1, right);
}
else
sort(a, left, right);//可用插入排序
}
6.快速排序2
int partion(vector<int> &A, int low, int high) {
int pivotkey = A[low];
int temp;
while (low < high) {
while (low < high && A[high] >= pivotkey)
high--;
A[low] = A[high];
while (low < high && A[low] <= pivotkey)
low++;
A[high] = A[low];
}
A[low] = pivotkey;
return low;
}
void qsort(vector<int> &a, int left, int right){
if(a.size()==0 || left<0 || right>=a.size() || right<=left)
return;
int index= Partition(a,left,right);
if(index>left)
qsort(a,left,index-1);
if(index<right)
qsort(a,index+1,right);
}
7.堆排
void HeapAdjust(vector<int> &v,int i,int size){
int max=i;
if(i<=(size-1)/2){//非叶子节点
if(2*i+1<size&&v[max]<v[2*i+1])//左子树2*i+1,数组是从0开始的
max=2*i+1;
if(2*i+2<size&&v[max]<v[2*i+2])//右子树2*i+2
max=2*i+2;
if(max!=i){
swap(v[i],v[max]);
HeapAdjust(v,max,size);//向下调整
}
}
}
void BuildHeap(vector<int> &v){
for(int i=v.size()-1;i>=0;--i)
HeapAdjust(v,i,v.size());
}
void HeapSort(vector<int> &v){
BuildHeap(v);
for(int i=v.size()-1;i>=0;--i){
swap(v[0],v[i]);
HeapAdjust(v,0,i);
}
}
主函数
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> b;
b.push_back(1);
b.push_back(5);
b.push_back(3);
b.push_back(7);
b.push_back(6);
//void qsort(vector<int> &a, int left, int right);
//qsort(b,0,b.size()-1);
//void bubble_sort(vector<int> &a);
//bubble_sort(b);
void selectSort(vector<int> &a);
selectSort(b);
//vector<int> temp(b.size());
//for(int i=0;i<b.size();++i)
//temp.push_back(b[i]);
//void mergesort(vector<int> &a, vector<int> &temp, int left, int right);
//mergesort(b,temp,0,b.size()-1);
//void f(vector<int>&);
//f(b);
for(vector<int>::iterator pos=b.begin();pos!=b.end();pos++)
cout<<*pos<<' ';
return 0;
}