C语言中数组常用的排序算法

目录


一.C语言中数组的一些算法

把数据按照从小到大或从大到小 的顺序进行排列

有很多算法:冒泡排序、选择排序、插入排序、快速排序、计数排序、堆排序 …….

常用的有四种:

1.1冒泡排序

主要思想:

总共需要比较n-1轮

每一轮依次比较当前元素和后面的元素,如果当前元素比后面元素大,则交换他们的位置

一轮下来,最大的元素放在了数组最后面

int a[10] = {50,23,80,18,100,5,10,58,30,2};

第一轮:

23,50,18,80,5,10,58,30,2,100

第二轮:

23,18,50,5,10,58,30,2,80,100

......

for(i=0;i<10-1;i++)//比较10-1轮

{

for(j=0;j<10-1-i;j++)

{

if(a[j] > a[j+1])

{

//交换

temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

1.2选择排序

总共需要比较n-1轮

每一轮比较最多只交换一次数据(把最大数字放在最后面位置或把最小的数字放在最前面位置)

 

 

#include<stdio.h>

int main()

{

    int a[10] = {50,23,80,18,100,5,10,58,30,2};

    

    int i,j;

    int temp;

   

    for(i=0;i<10-1;i++)//进行n-1轮比较

    {

        int max = a[0];//假设最大的数字是a[0]

        int index = 0;//用来保存最大值的下标

        for(j=0;j<10-i;j++)//每一轮比较把最大的数字放在最后面

        {

            if(a[j] > max)

            {

                max = a[j];

                index = j;

            }

        }

        

        //至此我们已经最大值为 max, 他的下标为index ,交换 a[index] 所在元素和 a[9-i]

        if(index != 9-i)

        {

            temp = a[index];

            a[index] = a[9-i];

            a[9-i] = temp;

        }

    }

    for(i=0;i<10;i++)

    {

        printf("%d ",a[i]);

    }

    printf("\n");

    return 0;

 }

类似的,把最小的放后面:

#include<stdio.h>

int main()

{

    int a[10] = {50,23,80,18,100,5,10,58,30,2};

    

    int i,j;

    int temp;

   

    for(i=0;i<10-1;i++)

    {

        //每一轮比较把最小的数字放在最前面

        int min = a[9];

        int index = 9;

        for(j=0+i;j<10;j++)

        {

            if(a[j]<min)

            {

                min = a[j];

                index = j;

            }

        }

        

        //至此我们已知最小值为 min ,他的下标为index ,交换 a[index] 所在元素和 a[i]

        if(index != i)

        {

            temp = a[index];

            a[index] = a[i];

            a[i] = temp;

        }

    }

    

    for(i=0;i<10;i++)

    {

        printf("%d ",a[i]);

    }

    printf("\n");

    return 0;

}

1.3插入排序

算法思想:直接插入排序是无序序列插入到有序序列中,通常假定a[0]为已经排好序的子序列,然后将剩下无序序列一个一个插入到有序的子序列中。适用于基本有序和数据量不大的情况。

 

#include<stdio.h>

#include<math.h>



int main()

{

    int a[10] = {999,10,15,18,5,30,80,26,345,-10};

    

    int i,j;

    for(i=1;i<10;i++)//总共需要插入9轮

    {

        //把 a[i] 插入到前面的有序集合中,使之仍然有序

        int data = a[i];

        for(j=i-1;j>=0;j--)

        {

            if(a[j]>data)

            {

                a[j+1] = a[j];

            }

            else

            {

                a[j+1] = data;

                break;

            }

        }

        

        if(j==-1)

        {

            a[0] = data;

        }

    }

        

    

    for(i=0;i<10;i++)

    {

        printf("%d ",a[i]);

    }

    printf("\n");

    

}

1.4快速排序

1先从数组中选取一个数作为基准点,可随机选择;

2 将数组中大于该基准点的放在该基准点右边,小于该基准点的放在该基准点左边;

3 对左右两个数组进行快速排序。

代码示例:

#include <stdio.h>

//快速排序 有左右两边 因此我需要传进来左右的下标

void FastSort(int a[],int left,int right)

{

    //当左边比右边不得小 我们就没有必要排序了

    if(left >= right)

        return;

    int l = left;

    int r = right;

    //设置基准点 我这里设置的是第一个

    int temp = a[left];

    //将我们的数组进行一次快排

    //将temp的左边变得都比temp小,右边都比temp大

    while(l < r)

    {

        //由于你的基准点是在左边第一个  因此首先就要从右边找到左边

        //将右边小于基准点的元素弄到左边去

        for(;r > l;r--)

        {

            if(temp > a[r])

            {

                //将这个小一点的数弄到左边去

                a[l] = a[r];

                break;

            }

        }

        

        //然后从左边找到右边去 找到比基准点大的 放在右边去

        for(;r > l;l++)

        {

            if(temp < a[l])

            {

                //将大的数弄到右边去

                a[r] = a[l];

                break;

            }

        }        

    }

    a[l] = temp;//恢复基准点

    

    //以相同的规则将左边的排序

    FastSort(a,left,l - 1);

    

    //以相同的规则将右边排序

    FastSort(a,r + 1,right);

    

    

}





//打印数组

void PrintArr(int arr[],int n)

{

    for(int i = 0;i < n;i++)

        printf("%d ",arr[i]);

    printf("\n");

    

}



int main()

{

    int a[] = {12378,34,412,453,34,25,4,432,5,43};

    

    FastSort(a,0,sizeof(a) / sizeof(a[0]) - 1);

    

    

    PrintArr(a,sizeof(a) / sizeof(a[0]));

    

    

    return 0;

}

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月12日
下一篇 2023年12月12日

相关推荐