常见排序算法总结-C++实现

25 篇文章 2 订阅
#include <iostream>
using namespace std; 

int arr[] = {2,3,1,5,4,6,8,7,9,10};

void print(int *arr,int len){
    for(int i=0;i<len;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
} 

//冒泡-升序排列 
void bubble_sort_asc(int* arr,int len){
    for(int i=1;i<len;i++){
        for(int j=0;j<len-i;j++){
            if(arr[j] > arr[j+1]){
                swap(arr[j],arr[j+1]);
            }
        }
    }   
}
//冒泡-降序排列 
void bubble_sort_desc(int*arr,int len){
    for(int i=0;i<len;i++){
        for(int j=0;j<len-i-1;j++){
            if(arr[j] < arr[j+1]){
                swap(arr[j],arr[j+1]);
            }
        }
    }
}

//选择排序-升序
void select_sort_asc(int *arr,int len){
    for(int i=0;i<len;i++){
        int min = i;
        for(int j=i+1;j<len;j++){
            if(arr[min] > arr[j]){
                min = j;
            }
        }
        if(min != i)    
            swap(arr[i],arr[min]);
    }
} 

//选择排序-降序
void select_sort_desc(int *arr,int len){
    for(int i=0;i<len;i++){
        int max = i;
        for(int j=i+1;j<len;j++){
            if(arr[max] < arr[j]){
                max = j;
            }
        }
        if(max != i)    
            swap(arr[i],arr[max]);
    }
} 

//插入排序-升序
void insert_sort_asc(int *arr,int len){
    int record,index;
    for(int i=1;i<len;i++){
        index = i-1;
        record = arr[i];
        while(record < arr[index] && index>=0){
            arr[index+1] = arr[index];
            index--;
        } 
        //加1回退到争正确位置
        arr[index+1] = record;
    }
} 

//插入排序-降序
void insert_sort_desc(int *arr,int len){
    int record,index;
    for(int i=1;i<len;i++){
        index = i-1;
        record = arr[i];
        while(record > arr[index] && index>=0){
            arr[index+1] = arr[index];
            index--;
        } 
        arr[index+1] = record;
    }
} 

//希尔排序-降序
void shell_sort_desc(int* arr,int len){
    int record,index;
    for(int i = len/2;i>=1;i /= 2){
        for(int j=i;j<len;j++){
            record = arr[j];
            index = j-i;
            while(index >=0 && record > arr[index]){
                arr[index+i] = arr[index];
                index -= i;
            }
            arr[index+i] = record;
        }
    }
} 

//希尔排序-升序
void shell_sort_asc(int* arr,int len){
    int record,index;
    for(int i = len/2; i >= 1;i /= 2){
        for(int j=i;j<len;j++){
            record = arr[j];
            index = j-i;
            while(index >=0 && record < arr[index]){
                arr[index+i] = arr[index];
                index -= i;
            }
            arr[index+i] = record;
        }
    }
} 
//快速排序-升序
//partition
int partition(int* arr,int low,int high){
    int pivotkey = arr[low];
    while(low < high){
        while(low<high && arr[high] >= pivotkey){  //降序  while(low<high && arr[high] <= pivotkey)
            high--;
        }
        swap(arr[low],arr[high]);
        while(low<high && arr[low] <= pivotkey){  //降序  while(low<high && arr[high] >= pivotkey)
            low++;
        }
        swap(arr[low],arr[high]);
    }
    return low;
} 
//quick-sort
void quick_sort_asc(int *arr,int low,int high){
    int pivot;
    if(low < high){
        pivot = partition(arr,low,high);
        quick_sort_asc(arr,low,pivot-1);
        quick_sort_asc(arr,pivot+1,high);
    }   
} 

//堆排序
void heap_sort(int* arr,int n){
    int i,j,h,k;
    int t;
    //将a[0,n-1]建成大根堆 
    for(i=n/2-1;i>=0;i--){
        cout<<"for() i:"<<i<<endl; 
        while(2*i+1<n){
            cout<<"while() i:"<<i<<endl;
            j = 2*i+1;
            if((j+1)<n){
                if(arr[j] <arr[j+1]){   //左子树 小于右子树,则需要比较右子树 
                    j++;            //序号增加1,指向右子树 
                }
            }
            if(arr[i] < arr[j]){        //比较i与j为序号的数据 
                t = arr[i];         //交换数据 
                arr[i] = arr[j];
                arr[j] = t;
                i=j; 
            }else{                  //比较左右子结点均大则堆为破坏,不在需要调整 
                break; 
            } 
        } 
    }
    //输出数据构成的堆
    cout<<"输出数据构成的堆:"<<endl;
    for(h=0;h<n;h++){
        cout<<"arr["<<h<<"]:"<<arr[h]<<'\t'; 
    } 
    cout<<endl;
    for(i=n-1;i>0;i--){         
        t = arr[0];     //与第i个记录交换
        arr[0] = arr[i];    
        arr[i] = t;
        k = 0;
        while(2*k+1 < i){
            j = 2*k+1;
            if((j+1)<i){
                if(arr[j] < arr[j+1]){  
                    j++; 
                }
            }
            if(arr[k] < arr[j]){        //比较i与j为序号的数据 
                t = arr[k];
                arr[k] = arr[j]; 
                arr[j] = t;
                k = j;
            }else{
                break;
            }
        }
        cout<<"第"<<n-i<<"步排序结果 ";
        for(h=0;h<n;h++){
            cout<<"arr["<<h<<"]:"<<arr[h]<<'\t'; 
        } 
        cout<<endl;
    }
}
//归并排序 
/**
    @params 
    a 保存带排序的数组
    b 保存合并后的数组
    n 表示数组a中需要进行排序的元素总数
    len 表示每个字长度的长度 
*/
void merge_one(int* a,int* b,int n,int len){
    int i,j,k,s,e;
    s = 0;
    while(s+len < n){
        e = s + 2*len -1;
        if(e >= n){
            //最后一段可能少于len个结点
            e = n - 1; 
        }
        //相邻有序段的合并
        k = s;
        i = s;
        j = s + len; 
        while(i < s+ len && j <= e){ //如果两个有序表都未结束时,循环比较 
            if(a[i] <= a[j]){
                b[k++] = a[i++];//较小的元素复制到数组b中 
            }else{
                b[k++] = a[j++];
            }
        }
        while(i < s+len){   //未合并的部分复制到数组b中 
            b[k++] = a[i++]; 
        } 
        while(j<=e){
            b[k++] = a[j++];//未合并的部分复制到数组b中 
        }
        s = e+1;    //下一对有序段中左段的开始下标 
    }
    if(s<n){    //将剩余部分的下一个有序段 从数组A中复制到数组B中 
        for(;s<n;s++){
            b[s] = a[s];
        }
    }
} 
void merge_sort(int* arr,int n) {
    int h,count,len,f;
    count =0;   //排序步骤
    len = 1;    //有序序列的长度 
    f = 0;      //变量f坐标志 
    int* p= new int[n]; 
    while(len < n){
        if(f == 1){ //交替在A和P之间合并 
            merge_one(p,arr,n,len); //p合并到a 
        }else{
            merge_one(arr,p,n,len); //a合并到p 
        } 
        len = len*2;    //增加有序序列长度
        f = 1-f;        //使f在0 和 1 之间切换
        count ++;
        cout<<"第"<<count<<"步排序结果." ;
        for(h=0;h<n;h++){
            cout<<arr[h]<<'\t';
        } 
        cout<<endl;
    }
    if(f == 1){ //如果进行了排序, 
        for(h=0;h<n;h++){   //将内存p中的数据复制回a数组 
            arr[h] = p[h];
        }
    }
    delete[] p; 
}
int main(int argc, char** argv) {
    merge_sort(arr,10);
    print(arr,10);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值