排序算法集锦:冒泡、插入、选择、shell(希尔)、归并、快速排序
每一轮排序后输出排序结果
#include<iostream>
using namespace std;
void printcur(int *arr,int cnt){
for(int i=0;i<cnt;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
void bubsort(int *arr,int cnt){
cout<<"buble sort:"<<endl;
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt-i-1;j++){
if(arr[j]>arr[j+1]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
printcur(arr,cnt);
}
}
void insertsort(int * arr,int cnt){
cout<<"insertion sort:"<<endl;
for(int i=1;i<cnt;i++){
for(int j=i;j>=0&&arr[j]<=arr[j-1];j--){
int tmp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=tmp;
}
printcur(arr,cnt);
}
}
void selectsort(int * arr,int cnt){
cout<<"slect sort:"<<endl;
for(int i=0;i<cnt;i++){
int min_ind=i;
for(int j=i+1;j<cnt;j++){
if(arr[j]<arr[min_ind]){
min_ind=j;
}
}
int tmp=arr[i];
arr[i]=arr[min_ind];
arr[min_ind]=tmp;
printcur(arr,cnt);
}
}
void shellsort(int *arr,int cnt){
cout<<"shell sort:"<<endl;
int stride=cnt/2;
while(stride>=1){
for(int i=0;i<stride;i++){
for(int j=i;j<cnt-stride;j+=stride){//插入排序的过程
for(int k=j+stride;k>i&&arr[k]<arr[k-stride];k-=stride){
int tmp=arr[k];
arr[k]=arr[k-stride];
arr[k-stride]=tmp;
}
}
}
printcur(arr,cnt);
stride/=2;
}
}
//以下三个函数是merge sort的相关函数
void merge(int *arr,int *tmp,int s1,int e1,int s2,int e2){
int i=s1,j=s2;
int cur=s1;
while(i<e1&&j<e2){
if(arr[i]<=arr[j]){
tmp[cur++]=arr[i];
i++;
}
else{
tmp[cur++]=arr[j];
j++;
}
}
if(i<e1){
while(i<e1)
tmp[cur++]=arr[i++];
}
if(j<e2){
while(j<e2)
tmp[cur++]=arr[j++];
}
for(int k=s1;k<e2;k++){
arr[k]=tmp[k];
}
}
void ms(int *arr,int * tmp,int s,int e,int cnt){//开始结束位置
if(e-s<=1)
return ;
ms(arr,tmp,s,(s+e)/2,cnt);
ms(arr,tmp,(s+e)/2,e,cnt);
for(int i=s;i<e;i++){
tmp[i]=arr[i];
}
merge(arr,tmp,s,(s+e)/2,(s+e)/2,e);
printcur(arr,cnt);
}
void mergesort(int *arr,int cnt){ //这个函数主要是为了main函数统一调用接口
cout<<"merge sort:"<<endl;
int *tmp=new int[cnt];
ms(arr,tmp,0,cnt,cnt);
}
//quicksort
int partition(int *arr,int s,int e,int value){
while(s<e){
while(arr[++s]<=value);
while((s<e)&&(arr[--e]>=value));
int tmp=arr[s];
arr[s]=arr[e];
arr[e]=tmp;
}
return s;
}
void qsort(int *arr,int s,int e,int cnt){
if(s>=e)
return ;
int pivotindex=(s+e)/2;
int tmp=arr[pivotindex];
arr[pivotindex]=arr[e]; //把轴值放到最后的位置上
arr[e]=tmp;
int k=partition(arr,s-1,e,tmp);
tmp=arr[k];
arr[k]=arr[e];
arr[e]=tmp;
printcur(arr,cnt);
qsort(arr,s,k-1,cnt);
qsort(arr,k+1,e,cnt);
}
void quicksort(int *arr,int cnt){
cout<<"quick sort:"<<endl;
qsort(arr,0,cnt-1,cnt);
}
//main
int main(){
int n;
cin>>n;
int *num=new int[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
cout<<endl;
//bubsort(num,n); //冒泡
//insertsort(num,n); //插入
//selectsort(num,n); //选择排序
//shellsort(num,n); //希尔排序
//mergesort(num,n); //归并排序
quicksort(num,n); //快速排序
}