关于十大排序算法的讲解【建议用visio画图动态演示一下】

1.冒泡排序:从前往后两两元素比较,把最大的 元素放后面

#include<algorithm>
#include<iostream>
using namespace std;
void bubblesort(int arr[],int n){
    for(int i=n-1;i>0;i--){
        for(int j=0;j<i;j++){
             if(arr[j]>arr[j+1])
             swap(arr[j],arr[j+1]);
        }
    }
}
int main(){
    int arr[]={2,3,4,5,6,9,8,7};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubblesort(arr,n);
    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
}

运行结果:

2.基数排序:

//基数排序就是根据数字的每一位来排序,不断更新位数实现数字的排序
#include<iostream>
#include<algorithm>
using namespace std;
void basesort(int arr[],int n){
     int max_ele=*max_element(arr,arr+n);
     int count[10];//设置数组统计各种类型数字出现位数
     int output[n];
     for(int exp=1;max_ele/exp<1;exp*=10)
     {
         //统计位数
         for(int i=0;i<n;i++){
            count[(arr[i]/exp)%10]++;
         }
         //利用前缀和确定放入元素位置
         for(int j=1;j<n;j++){
            count[j]+=count[j-1];
         }
         
         for(int m = n-1;m>0;m--){ //只能从大到小遍历
            output[count[(arr[m]/exp)%10]-1]=arr[m];
            count[(arr[m]/exp)%10]--;
         }


     }
}
int main(){
    int arr[]={2,3,4,5,89,98};
    int n=sizeof(arr)/sizeof(arr[0]);
    basesort(arr,n);
    for(int i=0;i<n;i++){
        cout << arr[i] << " ";
    }
}

3.计数排序:

//统计每个元素出现的次数作为序号,利用前缀和让数组有序
#include<iostream>
#include<algorithm>
using namespace std;
void count_sort(int arr[],int n){
    //确定最大数
    int max_ele=*max_element(arr,arr+n);
    // int max_bit;
    // while(max_ele>0)
    // {
    //     max_ele/=10;
    //     max_bit++;
    // }
    //统计前缀和
    int  count[max_ele+1]={0};
    int  output[n];
    for(int i=0;i<n;i++){
        count[arr[i]]++;
    }
    for(int i=1;i<=max_ele;i++){
        count[i]+=count[i-1];
    }
    //复制一个数组,把这些元素放到本该属于的位置
    for(int i=0;i<n;i++){
        output[count[arr[i]]-1]=arr[i];
    }
    for(int j=0;j<n;j++){
        arr[j]=output[j];
    }
}
int main(){
    int arr[]={3,4,5,6,8,9,7};
    int n=sizeof(arr)/sizeof(arr[0]);
    count_sort(arr,n);
    for(int m=0;m<n;m++){
        cout<<arr[m]<<" ";
    }
}

4.桶排序:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void bucketsort(float arr[],int n){
     vector<float>  buckets[n];
     //将元素分到桶里面
     for(int m=0;m<n;m++){
         //确定桶的序号
         int  bucketindex=n  * arr[m];
         buckets[bucketindex].push_back(arr[m]);
     }
     //桶内部排序 
     for(int i=0;i<n;i++){
        sort(buckets[i].begin(),buckets[i].end());
     }
     //排序后的元素放到更新的数组里面
     int index=0;
     for(int i=0;i<n;i++){
        for(float value: buckets[i])  //有多个值
        {
            arr[index++]=value;
        }
     }

}
int main(){
    float  arr[]={0.9,0.8,0.7,0.3,0.5,0.6};
    int n =sizeof(arr)/sizeof(arr[0]);
    bucketsort(arr,n);
    for(int m = 0; m< n;m++){
        cout << arr[m] << " ";
    }
}

5.归并排序:

//利用二分的思想不断进行左边和右边递归地二分排序,(始终左边的元素小于右边)直至整个数组有序
#include<iostream>
#include<algorithm>
using namespace std;

void partition(int arr[],int low,int mid,int high){
    int n1=mid-low+1,n2=high-mid;
    int output[n1+n2];
    int i=low,j=mid+1;
    int index=low;
    while(i<=mid&&j<=high){  //不能用for循环,for循环我们无法得出什么时候其中一个所有所有元素比较好,(只有小的被拿走)。
            if(arr[i]>arr[j]){
                   output[index++]=arr[j];
                   j++;
            }else{
                output[index++]=arr[i];
                i++;
            }
    }
    while(i<=mid)      {
        output[index++]=arr[i++];
    }
    while(j<=high){
        output[index++]=arr[j++];
    }
    for(int m=low;m<=high;m++){
        arr[m]=output[m];
    }
                   
    }

void mergesort(int arr[],int low ,int high){
 
    if(low<high){
        int mid =low+(high-low)/2;
        mergesort(arr,low,mid);
        mergesort(arr,mid+1,high);
        partition(arr,low,mid,high);
    }
       
}
int main(){
    int arr[]={29,385,45,66,87};
    int n = sizeof(arr)/sizeof(arr[0]);
    mergesort(arr,0,n-1);
    for(int m = 0; m<n;m++){
        cout<<arr[m]<<" ";
    }
}

6.堆排序:

#include<iostream>
#include<algorithm>
using namespace std;
//通过自下而上对非叶子节点遍历.

void heapinit(int arr[],int i,int n){
     int  max=i;
     int  max_l=2*i+1;
     int  max_r=2*i+2;
     if(max_l<n&&arr[max_l]>arr[max]){
        max=max_l;
     }
     if(max_r<n&&arr[max_r]>arr[max]){
        max=max_r;
     }
     if(max!=i){
        swap(arr[i],arr[max]);
        heapinit(arr,max,n);//根据根顶点元素继续向底层调整堆
     }


}
void heapsort(int arr[],int n){
     for(int i=n/2-1;i>=0;i--){
        heapinit(arr,i,n);
     }
  
     for(int i=n-1;i>=1;i--){
        swap(arr[i],arr[0]);
        //调整堆
        heapinit(arr,0,i);
     }
}
    
int main(){
    int arr[]={3,4,5,8,7,9,1};
    int n=sizeof(arr)/sizeof(arr[0]);
    heapsort(arr,n);
    for(int m = 0; m<n;m++){
        cout<<arr[m]<<" ";
    }
}

7.插入排序:

//第一个元素有序,从第二个元素开始插入保证前面有序,比后续元素大的往后移,小的后面插入该元素直到整个数组有序
#include<iostream>
#include<algorithm>
using namespace std;
void insert_sort(int arr[],int n){

      for(int i=1;i<n;i++){ 
          for(int j=i-1;j>=0;j--){
            if(arr[j]>arr[i]){
                arr[j+1]=arr[j];
            }else{
                swap(arr[++j],arr[i]);
                break;
            }
          }
      }
}
int main(){
    int arr[] = {3,4,5,6,7,8,0,9};
    int n=sizeof(arr)/sizeof(arr[0]);
    insert_sort(arr,n);
    for(int m=0;m<n;m++){
        cout<<arr[m]<<" ";
    }
    
}

8.希尔排序:

//增量排序
#include<iostream>
#include<algorithm>
using namespace std;
void shell_sort(int arr[],int n){
      for(int gap=n/2;gap>=1;gap/=2){
          for(int i =gap;i<n;i++){
              if(arr[i-gap]>arr[i]){
                swap(arr[i-gap],arr[i]);
              }
          }
      }
}
int main(){
    int arr[]={4,5,6,7,8,9,0,12};
    int n=sizeof(arr)/sizeof(arr[0]);
    shell_sort(arr,n);
    for(int m=0;m<n;m++){
        cout<<arr[m]<<" ";
    }
}

9.快速排序:

//快排以最后一个元素作为基准值通过交换来划分,左边要小于右边,递归地进行划分;每次划分的pivot值不一样
#include<iostream>
#include<algorithm>
using namespace std;
void quicksort(int arr[],int low,int high){
    if(low<high){
    int pivot = arr[high];
    int   i = low-1;
    for(int j=low;j<high;j++){
        if(arr[j]<pivot){
            swap(arr[j],arr[++i]);
        }
    }
    swap(arr[++i],arr[high]);  //划分
    
    quicksort(arr,low,i-1);
    quicksort(arr,i+1,high);
    }


}
int main(){
    int arr[]={3,4,5,6,9,8,10};
    int n = sizeof(arr)/sizeof(arr[0]);
    quicksort(arr,0,n-1);
    for(int m=0;m<n;m++){
        cout<<arr[m]<<" ";
    }
}

10.选择排序:

//从待排序的序列中选择最小的元素放到前面直到整个数组有序
#include<iostream>
#include<algorithm>
using namespace std;
void select_sort(int arr[],int n){
    for(int i=0;i<n-1;i++)
    { 
        int min_index=i;
        for(int j=i+1;j<n;j++)  {
            if(arr[j]<arr[i]){
                swap(arr[j],arr[i]);
            }
        }
    }
}
int main(){
    int arr[]={3,4,5,6,7,8,9,12,15};
    int n=sizeof(arr)/sizeof(arr[0]);
    select_sort(arr,n);
    for(int m=0;m<n;m++){
        cout<<arr[m]<<" ";
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值