直接插入排序
#include <iostream>
using namespace std;
void insertsort(int *a,int n){
for(int i=0;i<n;i++){
int end=i;
int tmp=a[end+1];
while(end>=0){
if(tmp<a[end]){
a[end+1]=a[end];
end--;
}
else{
break;
}
}
a[end+1]=tmp;
}
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
insertsort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
双向选择排序
#include <iostream>
using namespace std;
#include <algorithm>
void selectsort(int *a,int n){
int left=0;
int right=n-1;
while(left<right){
int minindex=left,maxindex=left;
for(int i=left;i<=right;i++){
if(a[i]<a[minindex]) minindex=i;
if(a[i]>a[maxindex]) maxindex=i;
}
swap(a[left],a[minindex]);
if(maxindex==left) maxindex=minindex;
swap(a[right],a[maxindex]);
left++;
right--;
}
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
selectsort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
冒泡排序
#include <iostream>
using namespace std;
#include <algorithm>
void bubblesort(int *a,int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
}
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
bubblesort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
归并排序(递归)
#include <iostream>
using namespace std;
#include <cstring>
void _mergesort(int *a,int begin,int end,int *tmp){
if(begin>=end) return;
int mid=begin+(end-begin)/2;
_mergesort(a,begin,mid,tmp);
_mergesort(a,mid+1,end,tmp);
int begin1=begin;
int end1=mid;
int begin2=mid+1;
int end2=end;
int i=begin;
while(begin1<=end1&&begin2<=end2){
if(a[begin1]<=a[begin2]) tmp[i++]=a[begin1++];
else tmp[i++]=a[begin2++];
}
while(begin1<=end1) tmp[i++]=a[begin1++];
while(begin2<=end2) tmp[i++]=a[begin2++];
memcpy(a+begin,tmp+begin,(end-begin+1)*sizeof(int));
}
void mergesort(int *a,int n){
try{
int *tmp=new int[n];
_mergesort(a,0,n-1,tmp);
delete[] tmp;
}
catch(bad_alloc&e){
cerr<<"Memory allocation falied:"<<e.what()<<endl;
throw;
}
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
mergesort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
迭代式归并排序
#include <iostream>
using namespace std;
#include <cstdlib>
void _mergesort(int* a,int* tmp,int begin1,int end1,int begin2,int end2){
int i=begin1;
int j=begin1;
while(begin1<=end1&&begin2<=end2){
if(a[begin1]<a[begin2]) tmp[i++]=a[begin1++];
else tmp[i++]=a[begin2++];
}
while(begin1<=end1) tmp[i++]=a[begin1++];
while(begin2<=end2) tmp[i++]=a[begin2++];
for(;j<=end2;j++) a[j]=tmp[j];
}
void mergesort(int* a,int n){
try{
int* tmp=new int[n];
int gap=1;
while(gap<n){
int i=0;
for(i=0;i<n;i+=2*gap){
int begin1=i;
int end1=i+gap-1;
int begin2=i+gap;
int end2=i+2*gap-1;
if(begin2>=n) break;
if(end2>=n) end2=n-1;
_mergesort(a,tmp,begin1,end1,begin2,end2);
}
gap*=2;
}
delete[] tmp;
}
catch(bad_alloc&e){
cerr<<"Memory allocation failed"<<e.what()<<endl;
exit(EXIT_FAILURE);
}
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
mergesort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
快速排序(递归)–挖坑法
#include <iostream>
using namespace std;
#include <algorithm>
int getmidindex(int* a,int left,int right){
int mid=left+(right-left)/2;
if(a[left]<a[mid]){
if(a[mid]<a[right]) return mid;
else if(a[right]<a[left]) return left;
else return right;
}
else{
if(a[mid]>a[left]) return mid;
else if(a[right]>a[left]) return left;
else return right;
}
}
int partsort(int* a,int left,int right){
int mid=getmidindex(a,left,right);
swap(a[left],a[mid]);
int key=a[left];
int hole=left;
while(left<right){
while(left<right&&a[right]>=key) right--;
a[hole]=a[right];
hole=right;
while(left<right&&a[left]<=key) left++;
a[hole]=a[left];
hole=left;
}
a[hole]=key;
return hole;
}
void quicksort(int* a,int left,int right) {
if(left>=right) return;
int keyi=partsort(a,left,right);
quicksort(a,left,keyi-1);
quicksort(a,keyi+1,right);
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
quicksort(a,0,9);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
快速排序(非递归法)
#include <iostream>
using namespace std;
#include <vector>
struct stack{
vector<int> data;
};
void initstack(stack* st){
st->data.clear();
}
bool stackempty(const stack* st){
return st->data.empty();
}
void stackpush(stack* st,int value){
st->data.push_back(value);
}
int stacktop(const stack* st){
return st->data.back();
}
void stackpop(stack* st){
st->data.pop_back();
}
void stackdestroy(stack* st){
st->data.clear();
}
int partsort(int* a,int left,int right){
int mid=left+(right-left)/2;
if(a[left]>a[mid]) swap(a[left],a[mid]);
if(a[left]>a[right]) swap(a[left],a[right]);
if(a[mid]>a[right]) swap(a[mid],a[right]);
int key=a[right];
int i=left,j=right-1;
while(i<=j){
while(i<=j&&a[i]<=key) i++;
while(i<=j&&a[j]>key) j--;
if(i<j) swap(a[i],a[j]);
}
swap(a[i],a[right]) ;
return i;
}
void quicksort(int* a,int begin,int end){
stack st;
initstack(&st);
stackpush(&st,begin);
stackpush(&st,end);
while(!stackempty(&st)){
int right=stacktop(&st);
stackpop(&st);
int left=stacktop(&st);
stackpop(&st);
if(left>=right) continue;
int keyi=partsort(a,left,right);
if(keyi+1<right){
stackpush(&st,keyi+1);
stackpush(&st,right);
}
if(keyi-1>left){
stackpush(&st,left);
stackpush(&st,keyi-1);
}
}
stackdestroy(&st);
}
int main()
{
int a[10]={67,12,33,56,78,99,11,0,90,66};
quicksort(a,0,9);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}