各种排序算法,一步步更新(一),桶排序,冒泡排序,选择排序,快速排序

版权声明:谢谢 https://blog.csdn.net/Waybyway/article/details/83097073

部分方法来自我关注的博主  J_小浩子  谢谢

1 桶排序  bucketsort

1 桶排序
#include <stdio.h>//桶排序基本说明
int main(){
    int data1[11]={0},temp,i,j;
                                //  num=11  所以桶排序只能用来输入和储存0-10 之间的数  字//data1【11】={0}让数组元素的初始数值 初始化为0
    for(i=0;i<11;i++){
        scanf("%d",&temp);
                                // 以temp作为输入介质  输入的0-10之间的数字  输入给temp对应的数组data1【temp】会加1
        data1[temp]++;
                                //数组像是一个木桶一样  储存输入的0-10 之间数字的数量
    }
    for(i=0;i<11;i++){
                                // i作为引导  从0走到10
        for(j=0;j<data1[i];j++){
                                //j用来检测  data1【i】的值,大于0则可以输出,按照data1【i】的值即木桶的数量输出次数
            printf("%d ",i);
      }
    }
    return 0;
}
//方法来自  啊哈算法 时间复杂度O(n=11) ,O(n)

2 冒泡排序 bublesort

#include <stdio.h>
void bublesort(int data[],int n);//冒泡排序基本说明是 void的部分 //
                                //此题为啊哈算法 小哼买书的冒泡排序解法
int main(){
    int n,i,j,temp;
    scanf("%d",&n);
    int data1[n];
    for(i=0;i<n;i++){
        scanf("%d",&data1[i]);
    }
    bublesort(data1,n);
    printf("%d",data1[0]);
    for(i=1;i<n;i++){
        if(data1[i]!=data1[i-1]){
            printf(" %d",data1[i]);
        }
    }
    return 0;
}

void bublesort(int data[],int n){        // 基本冒泡排序说明  需要数组和数组元素数 N
    int i,j,temp;      
                    //i,和 J用来检查数组  按照从小往大方向排序,temp用来做替换介质
    for(i=0;i<n-1;i++){
                    //共N个元素  所以最多比较n-1次,如两个元素 最多比较一次
        for(j=0;j<n-i-1;j++){
                    //J从 开始项找  最多寻找n-i-1次 (最多n-1次比较,i每+1,就排好一个本趟中最大的元素,就只剩下n-i-1个需要比较的了,
                    //且初始是i为0 第一次可以减0,第一次以后 最大的元素在最后面,需要比较的元素个数为 (n-1)-1
                    //所以最多进行n-i-1次往后查找)
            if(data[j]>data[j+1]){
                    //因为按照从小往大排序 发现前一项大于后一项  就交换他们两个
                temp=data[j+1];
                data[j+1]=data[j];
                data[j]=temp;
            }
        }
    }
    return;
}

3 选择排序 selectsort

#include <stdio.h>
void selectsort(int data[],int n);//基本选择排序  利用数组和数组元素数
int main(){
    int i,n;
    scanf("%d",&n);
    int data1[n];
    for(i=0;i<n;i++){
        scanf("%d",&data1[i]);
    }
    selectsort(data1,n);
    for(i=0;i<n;i++){
        printf("%d ",data1[i]);
    }
    system("pause");//用于暂停
    return 0;
}

void selectsort(int data[],int n){
    int i,j,mini,temp;
    for(i=0;i<n-1;i++){  //一共n项元素,所以最多需要排序  n-1次
        mini=i;          // 假设每一次  最小项的下标mini是   i,按照从小往大排序
        for(j=i+1;j<n;j++){
            if(data[j]<data[mini]){
                         //  j=i+1 因为假设第i项是最小的  所以从i想后的 每一项寻找有没有比i更小的元素
                mini=j;
                        //那么检测  i项后面 有没有比data【mini=i】更小的项,如果有 就把mini下标标记成更小的
            }
        }
        if(i!=mini){
                         //如果  i!=mini说明  i不是最小项,mini被替换过,所标记项才是最小项
            temp=data[i]; 
                        //把最小项放到前面,较大项放到后面,这样把他们交换过来,按照从小往大排序
            data[i]=data[mini];
            data[mini]=temp;
        }
    }
    return;
}

4 快速排序 quicksort

#include <stdio.h>
int data1[100],n;
void quicksort(int left,int right);//快速排序
int main(){
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&data1[i]);//读入数组  共n项,从1到N项
    }
    quicksort(1,n);//对数组 1到N 进行快速排序,输出演示,暂停

    for(i=1;i<=n;i++){
        printf("%d ",data1[i]);
    }
    system("pause");
    return 0;
}

void quicksort(int left,int right){
    int i,j,t,temp;
                        //I , J,反别负责从左到右,从右往左遍历查找
    if(left>right){
                        //如果所给位置错误  右边序号小于左边,返回错误,结束
        return;
    }
    temp=data1[left];
                        //temp储存首项——基准数,i为左,J为右,遍历
    i=left;
    j=right;
    while(i!=j){
                        //两者未相遇,想让J从右边找到一个小于基准数的数字
        while(data1[j]>=temp && i<j){   //必须让右边先找一个小于基准数字的数
            j--;
        }
        while(data1[i]<=temp && i<j){
                        //再让I从左边找到一个大于基准数的数字
            i++;
        }
        if(i<j){
                       //因为这两者I J没有相遇,所以将他们两个交换  T取后面数值,后面数字=前面数字,前面数字=T
            t=data1[j];
                        //    基准数字为6*****73****   假设i位置为  7 J位置为 3  所以交换,下一次相遇3 和基准数6交
            data1[j]=data1[i];
                        //  6********87****正常  6**********i 58 j *********5 6交换
            data1[i]=t;
        }
    }
    data1[left]=data1[i];
                        //当i,和J相遇之后说明除了  首项基准数  之外就只有 相遇除的数字不合理,,
    data1[i]=temp;
                        //所以将 基准数 相遇处数字交换
    quicksort(left,i-1);//同理 递归操作处理基准数字左边  基准数字右边
    quicksort(i+1,right);
    return;
}

2018-10.16  第一篇博客 10.17完善  

由于算法入门所以废话和解释较多

加油,哈哈哈,冲鸭!!!!!!

猜你喜欢

转载自blog.csdn.net/Waybyway/article/details/83097073
今日推荐