桶排序+冒泡+选择+快排 之总结

一:

桶排序。

在2018年九月九号发现了这个神奇的算法,精神为之振奋!

这是一个最简单的桶排序,

例题:有五个学生的成绩,需要排序。

下列代码是桶排序的简化版,但是大致思想是相同的,不过这种排序对空间开销有点大:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[101]={};
int main()
{
    int i=0,sore=0;
    for(;i<5;i++){
        cin>>sore;
        a[sore]++;
    }
    for(int i=0;i<101;i++)
        for(int j=0;j<a[i];j++)
        if(a[i])cout<<i<<endl;
    system("pause");
}

冒泡:

老冒泡排序,自己分了一年也没有分清楚冒泡和选择排序的区别,希望自己这次记住吧!

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[5]={};
int main()
{
    int i=0,sore=0;
    for(;i<5;i++){
        cin>>sore;
        a[i]==sore;
    }
    for(int i=0;i<5-1;i++)//需要N-1次遍历 
        for(int j=0;j<5-1-i;j++)//每次将最大(小)的一个放在最后面 
            if(a[j]>a[i]){
                int tem=a[i];
                a[i]=a[j];
                a[j]=tem;
            } 
    system("pause");
}

接下来是选择排序:

这是鄙人闭着眼都能搞下来的排序!哈哈

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[5]={};
int main()
{
    int i=0,sore=0;
    for(;i<5;i++){
        cin>>sore;
        a[i]==sore;
    }
    for(int i=0;i<5-1;i++)//需要N-1次遍历 
        for(int j=i+1;j<5;j++)//每次将最大(小)的一个放在最后面 (这里和冒泡排序不一样)
            if(a[j]>a[i]){
                int tem=a[i];
                a[i]=a[j];
                a[j]=tem;
            } 
    system("pause");
}

还有快排,快速排序:

我在以前的博客:快速排序入门有图有真相的详细的介绍了快排,这里就再粗略提一下!

快排是一个具有二分思想的,最坏情况复杂度和冒泡一样的算法!

在最左(也可以是最右)设立一个哨兵,每次把大于哨兵的数放在哨兵右边,小于哨兵的数放在哨兵左边,递归至结束!

void quicksort(long left,long right)
{
    if(left>right){return ;}
    long i=left,j=right;
    long long tem=ac[left];
    while(i!=j){
        while(i<j&&ac[j]>=tem)j--;
        if(i<j)ac[i++]=ac[j];    
        while(i<j&&ac[i]<=tem)i++;
        if(i<j)ac[j--]=ac[i];
    }
    ac[i]=tem;
    quicksort(left,i-1);
    quicksort(i+1,right);
}


void quicksort(long left,long right)
{
    if(left>right)return ;
    long i=left,j=right;
    long long tem=ac[left]; 
    while(i<j){
        while(i<j){
            if(ac[j]>tem){j--;
            }else{
                ac[i++]=ac[j];    
                break;
            }
        }    
        
        while(i<j){
            if(ac[i]<tem){i++;
            }else {
                ac[j--]=ac[i];    
                break;
            }    
        }
    }
    ac[i]=tem;
    quicksort(left,i-1);
    quicksort(i+1,right);
}


void quicksort(int left,int right)
{
    int i,j,base;
    i=left; j=right;//i为最左下标志 
    base=ac[(i+j)/2];//随机取值取个中间值 
    while (i<=j){
        while (ac[i]<base) i++;
        while (ac[j]>base) j--;
        if (i<=j){
            int t=ac[i]; ac[i]=ac[j];ac[j]=t;
            i++;
            j--;
        }
    }
    if (left<j) quicksort(left,j);
    if (i<right) quicksort(i,right);
}

接下来会有合并等排序方法,日后补写!

猜你喜欢

转载自blog.csdn.net/xizi_ghq/article/details/82560590