zoukankan      html  css  js  c++  java
  • C 排序

    问题:给定6个数,按从大到小的顺序输出

    解决方法:

    冒泡排序

     

     代码:

    #include <stdio.h>
    #include <stdlib.h>
    const int n = 6;
    
    void main()
    {
        int i,temp,change,j,a[n];
        //输入
        for(i = 0;i < n;i++)
        {
            printf("请输入a[%d]:",i);
            scanf("%d",&a[i]);
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
        //从大到小排序
        for(i = 1;i < n ;i++)
        {
            change = 0;
            for(j = 0;j < n - i;j++)   // 从前向后比较
            {
                if(a[j] < a[j + 1])
                {
                    temp = a[j];
                     a[j] = a[j + 1];
                    a[j + 1] = temp;
                    change = 1;
                }
            }
            if(change = 0)
            {
                break;
            }
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
    }
    #include <stdio.h>
    #include <stdlib.h>
    const int n = 6;
    
    void main()
    {
        int i,temp,change,j,a[n];
        //输入
        for(i = 0;i < n;i++)
        {
            printf("请输入a[%d]:",i);
            scanf("%d",&a[i]);
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
        //从大到小排序
        for(i = 0;i < n - 1;i++)   // n-1趟
        {
            change = 0;
            for(j = n - 1;j > i;j--)    // 从后向前比较 n-i 次
            {
                if(a[j] > a[j - 1])
                {
                    temp = a[j];
                    a[j] = a[j - 1];
                    a[j - 1] = temp;
                    change = 1;
                }
            }
            if(change = 0)
            {
                break;
            }
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
    }

    快速排序

    算法思想:基于分治法:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表化为独立的两部分L[1,,k-1]和L[k+1.....n],使得L[1...k-1]中所有的元素小于pivot,L[k+1....n]中的所有元素大于或等于pivot,则pivot放在了其最终位置L(k)上,而后分别递归得对两个子表左重复操作,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    const int n = 7;
    
    //链表划分【当前第一个元素设为pivot】
    int partition(int a[],int low,int high)
    {
        int pivot = a[low]; //当前第一个元素设为pivot,对表进行划分
        while(low < high)
        {
            while(low < high && a[high] >= pivot) //将比pivot小的元素移动到左侧
                high--;
            a[low] = a[high];
            while(low < high && a[low] <= pivot) //将比pivot大的元素移动到右侧
                low++;
            a[high] = a[low];
        }
        a[low] = pivot; //pivot元素存放到最终位置
        return low;  //返回存放pivot的最终位置
    }
    //快速排序递归式
    void quicksort(int a[],int low,int high)
    {
        if(low < high)
        {
            int pivotpos = partition(a,low,high);
            quicksort(a,low,pivotpos - 1);
            quicksort(a,pivotpos+1,high);
        }
    }
    void main()
    {
        int a[] = {1,4,7,8,5,2,3};
        int low = 0, high = n - 1,i;
        quicksort(a,low,high);
    
        printf("排序后:
    ");
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i])
        }
    }

     使pivot每次是随机选取

    ??排序

    #include <stdio.h>
    #include <stdlib.h>
    const int n = 6;
    
    void main()
    {
        int i,temp,change,j,a[n];
        //输入
        for(i = 0;i < n;i++)
        {
            printf("请输入a[%d]:",i);
            scanf("%d",&a[i]);
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
        //从大到小排序
        for(i = 0;i < n - 1;i++)   // n-1趟
        {
            change = 0;
            for(j = i + 1;j < n;j++)    // 从开头起 逐元素比较
            {
                if(a[i] < a[j])
                {
                    temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                    change = 1;
                }
            }
            if(change = 0)
            {
                break;
            }
        }
        //输出
        for(i = 0;i < n;i++)
        {
            printf("%d	",a[i]);
        }
        printf("
    ");
    }

    简单选择排序

    算法思想:假设排序表为L【1....n】,第 i 趟排序即从L【i....n】中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n - 1 趟排序就可以使得整个排序表有序·

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
        int a[7] = {1,4,7,8,5,2,3};
        // 选择排序
        int i,j,min,temp;
        for(i = 0;i < 6;i++)  //一共进行n - 1趟
        {
            min = i;  //记录最小元素位置
            for(j = i + 1;j < 7;j++) //在a【i....n - 1】中选择最小的元素
            {
                if(a[j] < a[min])
                    min = j;  //更新最小元素位置
            }
            if(min != i)
            {
                //与第i个位置交换
                temp = a[i];
                a[i] = a[min];
                a[min] = temp;
            }
        }
        //排序后输出
        for(i = 0;i < 7;i++)
        {
            printf("%d	",a[i]);
        }
    }
  • 相关阅读:
    【高并发】面试官问我:为什么局部变量是线程安全的?
    Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
    【高并发】学好并发编程,关键是要理解这三个核心问题
    【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
    12张图带你彻底理解分布式事务产生的场景和解决方案!!
    【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
    【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
    十一长假我肝了这本超硬核PDF,现决定开源!!
    一文搞懂PV、UV、VV、IP及其关系与计算
    我把这个贼好用的Excel导出工具开源了!!
  • 原文地址:https://www.cnblogs.com/pam-sh/p/12436706.html
Copyright © 2011-2022 走看看