首页 > 其他分享 >选择排序、冒泡排序、插入排序、快速排序

选择排序、冒泡排序、插入排序、快速排序

时间:2022-10-09 16:35:17浏览次数:75  
标签:include int 插入排序 冒泡排序 high low key 排序

排序

选择排序

以数组a[8]={12,23,8,15,33,24,77,55}为例

WHILE(not sorted yet)
    find smallest unsorted item
    Swap firstunsorted item with the smallest
    set firstunsorted to firstunsorted+1*/
    #include <stdio.h>
int main()
{
    int i,j,t,a[8]={12,23,8,15,33,24,77,55};    //定义变量为基本整型
    for(i=0;i<=6;i++)
        for (j=i+1;j<=8;j++)
            if(a[i]>a[j])    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序后的顺序是:\n");
    for(i=0;i<=7;i++)
        printf("%5d", a[i]);    //输出排序后的数组
    printf("\n");
    return 0;
}

冒泡排序

# include <stdio.h>
int main(void)
{
    int a[] = {12,23,8,15,33,24,77,55};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf;  //交换数据时用于存放中间数据
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,
        {
            if (a[j] > a[j+1])
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}

插入排序

#include <stdio.h>
//自定义的输出函数
void print(int a[], int n ,int i){
    printf("%d:",i);
    for(int j=0; j<8; j++){
        printf("%d",a[j]);
    }
    printf("\n");
}
//直接插入排序函数
void InsertSort(int a[], int n)
{
    for(int i= 1; i<n; i++){
        if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
            int j= i-1;
            int x = a[i];
            while(j>-1 && x < a[j]){  //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = x;      //插入到正确位置
        }
        print(a,n,i);//打印每次排序后的结果
    }
}
int main(){
    int a[8] = {3,1,7,5,2,4,9,6};
    InsertSort(a,8);
    return 0;
}

快速排序

# include <stdio.h>
void QuickSort(int *, int, int);  /*现在只需要定义一个函数, 不用交换还省了一个函数, 减少了代码量*/
int main(void)
{
    int i;  //循环变量
    int a[] = {900, 2, -58, 3, 34, 5, 76, 7, 32, 4, 43, 9, 1, 56, 8,-70, 635, -234, 532, 543, 2500};
    QuickSort(a, 0, 20);  /*引用起来很简单, 0为第一个元素的下标, 20为最后一个元素的下标*/
    printf("最终排序结果为:\n");
    for (i=0; i<21; ++i)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}
void QuickSort(int *a, int low, int high)
{
    int i = low;
    int j = high;
    int key = a[low];
    if (low >= high)  //如果low >= high说明排序结束了
    {
        return ;
    }
    while (low < high)  //该while循环结束一次表示比较了一轮
    {
        while (low < high && key <= a[high])
        {
            --high;  //向前寻找
        }
        if (key > a[high])
        {
            a[low] = a[high];  //直接赋值, 不用交换
            ++low;
        }
        while (low < high && key >= a[low])
        {
            ++low;  //向后寻找
        }
        if (key < a[low])
        {
            a[high] = a[low];  //直接赋值, 不用交换
            --high;
        }
    }
    a[low] = key;  //查找完一轮后key值归位, 不用比较一次就互换一次。此时key值将序列分成左右两部分
    QuickSort(a, i, low-1);  //用同样的方式对分出来的左边的部分进行同上的做法
    QuickSort(a, low+1, j);  //用同样的方式对分出来的右边的部分进行同上的做法
}

————摘自(排序算法)

标签:include,int,插入排序,冒泡排序,high,low,key,排序
From: https://www.cnblogs.com/LizhenGfdhh/p/16771539.html

相关文章

  • SQLCookbook 学习笔记 2结果排序
    selectnamefromemporderbysalary;ORDERBY默认是按照升序排列,当需要倒序时用ORDREBYsalaryDESCORDERBY 不一定要基于列名,也可以用数字表示基于第几列:......
  • 快速排序的思路和代码
    首先 快速排序的时间复杂度是 O(n^2)   快速排序的平均时间复杂度是 O(nlogn),最好的时间复杂度是O(nlogn),最坏的时间复杂度是 O(n^2)。时间复杂度是以最坏的来计......
  • java----冒泡,选择,插入排序
    1.冒泡排序packagelearnday06排序;//动态录入往数组里录入n个数字,并用冒泡排序importjava.util.Arrays;importjava.util.Scanner;publicclassMaopaopaixu{ publ......
  • 四种排序
    对于无序数组的排序,方法有许多,这里可以以数组{12,23,8,15,33,24,77,55}先说四种。1.选择排序顾名思义,选择排序流程如下选择一个最小(或最大)的数,然后将其排在最前端(或最后端);固......
  • 执行@pytest.mark.run(order=3)排序不起作用
    学习pytest的时候修改测试用例执行顺序,发现顺序没有按照我设置的顺序执行,查询发现我的包没有安装pytest-ordering于是我安装pipinstallpytest-ordering,但提示我在其......
  • 后缀排序
    做了ABC270F,茅塞顿开。后缀排序,分明是抄的循环移位排序板子。ABC270F题意:给定两个长度为\(n\)的字符串\(s,t\),求有多少个有序点对\((i,j)\)使得\((s\rightarrow......
  • 冒泡排序
    voidsort(intarr[],intM)//注:数组传参过程中传过去的不是整个数组而是首元素的地址;//所以计算元素个数只能在主函数中进行;{//确定冒泡排序的趟数:通过推断可知为元素数-1......
  • 冒泡排序
    冒泡排序代码importjava.util.Arrays;publicclassBubbleSort{publicstaticvoidmain(String[]args){int[]numbers={5,1,3,2,4,6};......
  • 20 -- 排序算法之基数排序
        举例说明:1、第一轮:按照每个元素的 个 位取出,然后将这个数放在对应的桶(数组)中;在按照这个桶的顺序,放入原来的数组中-->  2、第二轮:按照每个元素的十 ......
  • 【Java基础】Collections集合概述和使用、ArrayList集合存储学生并排序及斗地主案例
    目录​​一、Collections概述和使用​​​​二、ArrayList集合存储学生并排序​​​​三、斗地主案例​​一、Collections概述和使用Collection类的作用:是针对集合操作的工......