c语言的三种数字排序方法

来源:互联网 发布:迷人的保姆 知乎 编辑:程序博客网 时间:2024/06/01 20:52

选择排序法

所谓选择排序法就是先将3个数中的最小的数与a[0]对换,再讲a[1]~a[2]中的最小的数与a[1]对换······每比较一轮,找出一个没有经过排序的最小的一个数。共比较2轮,下面我们举例说一下选择法的步骤如图:
这里写图片描述

代码如图

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){    void select(int sort[], int n);//声明void函数    int i;    int num[3];    printf("请输入3个数字:\n");    for (i = 0; i < 3; i++)    {        scanf("%d", &num[i]);    }    select(num, 3);    printf("排序之后的数字:\n");    for (i = 0; i < 3; i++)    {        printf("%d ", num[i]);    }    printf("\n");    system("pause");    return 0;}void select(int sort[], int n)//n是数组里的数字个数{    int i, j, max, temp;//i是下标,j是在i之后与i比较的数字的下标,max是最大的数字的下标,temp是中间变量用于互换    for (i = 0; i < n - 1; i++) //共比较n-1次    {        max = i;        for (j = i + 1; j < n; j++)        {            if (sort[max] < sort[j])                max = j;        }            temp = sort[max];            sort[max] = sort[i];            sort[i] = temp;    }}

先定义一个main主函数然后printf输入数据之后调用选择排序函数select,排好之后printf输出已经排好的数据。
然后我们开始我们这段程序的重点select选择排序函数。
首先我们定义四个整型变量i,j,max,temp。
i是数组的下标数,从0~2(a[0]到a[2]),即每次交换的时候被交换的那个数(例如第一次交换时的a[0])。
j亦为下标数,从1~2(a[1]~a[2])定义这个变量是每次从余下的数中选择最大数的时候的下标数。
max:从剩下的数中选择的最大数的下标j(只有一个)赋值给max。
temp为临时的一个变量在交换变量的时候使用。
然后我们进行第一次交换i=0,将i的值赋给max,然后对将a[j](a[1]~a[2])的值一个一个与第一个数进行比较若是有比第一个数字大的将这个数字的下标赋值给max,然后继续将后面的这些数字和这个sort[max]比较若是后面还有比这个数字更大的就将这个更大的数字的下标继续重新赋值给max直到找出后面数字中最大的数字的下标max。
然后利用temp进行数字的交换举个例子如图:
这里写图片描述

冒泡排序法

冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前面。举个例子,如果有6个数:9,8,5,4,2,0。第一次先将最前面的两个数9和8对调。第二次将第2个数和第3个数对调(9和5)······如此共进行5次得到8,5,4,2,0,9的顺序,可以看到:最大的数9已经沉到了最底下成为了最下面的一个数,而小的数“上升”。
然后进行第二轮比较,对余下的5个数进行冒泡排序,然后这五个数中最大的数8沉到了最底下。如此6个数进行5趟排序,才能使6个数按大小顺序排列。第一趟中要进行两个数之间的比较共5次,第二趟中要比较4次······第五趟中比较一次。即如果有n个数,则要进行n-1趟比较,第一次比较中需要进行n-1次两两比较,第二趟需要进行n-2次,第j次需要进行n-j次两两比较。如图

这里写图片描述
代码如下

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){    int sort[6];    int temp, i, j;//i是数组下标,j是比较次数    printf("请输入6个数字:\n");    for (i = 0; i < 6; i++)    {        scanf("%d", &sort[i]);    }    printf("\n");    for (j = 0; j < 5; j++)//6个数字总共排5趟    {        for (i = 0; i < 5 - j; i++)//每一趟交换5-j次        if (sort[i] > sort[i + 1])        {            temp = sort[i];            sort[i] = sort[i + 1];            sort[i + 1] = temp;//找出两个数中最小的的交换        }    }    printf("排序之后的:\n");    for (i = 0; i < 6; i++)        printf("%d", sort[i]);    system("pause");    return 0;}

当然如果只有三个数字排序的话我们可以不用这两种方法,我们可以用另一种更简单的比较法

比较交换法

我们可以先将前两个书中最大(小)的放在第一个变量里,然后再将第一个数与第三个数比较较大(小)的放在第一个数中,再将第二个数和第三个数比较将较大(小)的放在第二个数中,这样排出来的顺序就是由大到小(由小到大)
代码如下

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){    void compare(int a, int b);    int i = 5;    int j = 6;    int k = 2;    int temp;    if (i < j)    {        compare(i, j);    }    if (i < k)    {        compare(i,k);    }    if (j < k)    {        compare(j, k);    }    printf("%d  %d  %d", i, j, k);    system("pause");    return 0;}void compare(int a, int b){        int temp=0;        temp = a;        a = b;        b = temp;}

这时我们会发现,代码明明是正确的,但是运行的结果却不正确,这是因为当我们在调用函数时形参只是将实参的数据拷贝了一份另外开辟了一个地址将数据放了进去,的确在函数内部两个数字的值的确交换了,但是因为和实参不在一个地址内所以实参并没有交换,既然如此,我们可以在交换数字的时候直接将地址交换即可,我们可以把代码改成如下

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){    void compare(int a, int b);    int i = 5;    int j = 6;    int k = 2;    int temp;    if (i < j)    {        compare(&i, &j);    }    if (i < k)    {        compare(&i,&k);    }    if (j < k)    {        compare(&j, &k);    }    printf("%d  %d  %d", i, j, k);    system("pause");    return 0;}void compare(int *a, int *b){        int temp=0;        temp = *a;        *a = *b;        *b = temp;}
原创粉丝点击