精华内容
下载资源
问答
  • C语言排序算法

    2021-01-01 13:57:25
    C语言排序算法 1.冒泡排序 void BubbleSort(int a[],int n) { int i,j,t,flag=0;//flag用来标记是否发生交换 for(i=0;i<n;i++) { for(j=n-1;j>i;j--) { if(a[j-1]>a[j])//交换数据 { t=...

    C语言排序算法

    1.冒泡排序

    void BubbleSort(int a[],int n)
    {
    	int i,j,t,flag=0;//flag用来标记是否发生交换 
    	for(i=0;i<n;i++)
    	{
    		for(j=n-1;j>i;j--)
    		{
    			if(a[j-1]>a[j])//交换数据 
    			{
    				t=a[j-1];
    				a[j-1]=a[j];
    				a[j]=t;
    				flag=1;//有数据交换,设置标志变量 
    			}
    		}
    		if(flag==0)//没发生交换,直接跳出循环 
    		break;
    		else
    		flag=0;
    	}
     }
    
    展开全文
  • c语言排序算法

    2012-04-28 23:17:26
    c语言排序算法 非稳定的排序算法:选择排序、快速排序、希尔排序、堆排序 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。 让我们先定义一个整型数组a[n],下面用五种方法对其...

    c语言排序算法


    非稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

    稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。


    让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。
    (1)“冒泡法
    冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:

    void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/
    {
       int i,j,temp;
       for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++) /*注意循环的上下限*/
       if(a[i]>a[j])
        {
         temp=a[i];
         a[i]=a[j];
         a[j]=temp;
       }
    }

    冒泡法原理简单,但其缺点是交换次数多,效率低。
    下面介绍一种源自冒泡法但更有效率的方法“选择法”。

    (2)“选择法
    选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。

    提示:先找出最小的元素,放在数组的第一项;再找出第二小的,放在数组的第二项,以此类推。。最大的放在数组最后一项。

    void choise(int *a,int n)
    {
       int i,j,k,temp;
       for(i=0;i<n-1;i++)
       {
           k=i; /*给记号赋值*/
           for(j=i+1;j<n;j++) 

           {
               if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/ 

           }


           if(i!=k)    /*当k!=i是才交换,否则a[i]即为最小*/

           {     /*  得到小的元素就交换,从小到大排序  */
                  temp=a[i];
                  a[i]=a[k];
                  a[k]=temp;
            }
       }
    }

    选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。

    (3)“快速法
    快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:

    void quickSort(int *a,int i,int j)
    {
        int m,n,temp;
        int k;
        m=i;
        n=j;
        k=a[(i+j)/2]; /*选取的参照*/
        do
        {
            while(a[m]<k && m<j) m++; /* 从左到右找比k大的元素*/
            while(a[n]>k && n>i) n--; /* 从右到左找比k小的元素*/
            if(m<=n)
            {                           /*若找到且满足条件,则交换*/
                temp=a[m];
                a[m]=a[n];
                a[n]=temp;
                m++;
                n--;
            }
        }while(m<=n);
        if(m<j) quickSort(a,m,j); /*运用递归*/
        if(n>i) quickSort(a,i,n);
    }

    写法2

    随机化快排

    void base_quick_sort( int a[], int low, int highIndex)
    {
        int left = low, right = highIndex;
        int temp = a[low];    // 第一个作为参考
        if( low >= highIndex) return;
        // int a[] = {3,1,44,2,4,5,6,0};
        while( left != right)
        {
            // 右边开始扫描
            while( left < right && a[right] >= temp)
            {
                // 如果没找到 就 往前面继续比较
                right--;
            }
            // 找到比基准值小的,交换位置,把小的放在前面
            a[left] = a[right];

            // 左边开始扫描
            while( left < right && a[left] <= temp)
            {
                left++;
            }
            a[right] = a[left];

        }
        a[left] = temp;
        //     递归 两边排序
        base_quick_sort( a, low, left - 1);  // a[left]作为分割,左边快速排序
        base_quick_sort( a, left + 1, highIndex); // a[left]作为分割,右边快速排序
    }

    (4)“插入法

    稳定 
    插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。

    void insert_sort(int *a,int n)
    {
        int i; //
     int j; //
     int temp;
        for (i = 1; i < n; i++)
        {
            temp = a[i]; // 待插入元素,保存到临时变量中。
            for (j = i - 1; a[j] > temp && j >= 0; j--) // 在已经排好序的序列中从后面往前查找插入位置
            {
       // 向后移动数据(也就是把待插入元素给覆盖了,前面腾出一个空间)
                a[j + 1] = a[j];
            }

            a[j + 1] = temp; // 把待插入元素插到适当位置。或者插到腾出位置的地方。
         }
    }

     

    /*
     字符串排序
    */
    void insert_sort(char str[])
    {
     int i=1;/*记录已排序好的*/
     int ui=0;/*记录未排序的*/
     int move;
     char temp;
     for(i=1;str[i]!='\0';i++)/*要插入的字符位置,不用插入语第0个,只有一个元素的串是有序的*/
     {
      for(ui=0;ui<i;ui++)/*i之前的字符都是有序的*/
      {
       if(str[i]<str[ui])/*插入条件*/
       {
        temp=str[i];
        for(move=i;move>ui;move--) str[move]=str[move-1];//把串后移
        str[move]=temp; //插入
       }
      }
     }
    }

     

    (5)“shell法
    shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:

    void shell(int *a,int n)
    {
        int i,j,k,x;
        k=n/2; /*间距值*/
        while(k>=1)
        {
          for(i=k;i<n;i++)
          {
            x=a[i];
            j=i-k;
            while(j>=0&<a[j])
            {
                a[j+k]=a[j];
                j-=k;
            }
            a[j+k]=x;
          }
         k/=2; /*缩小间距值*/
        }
    }

    上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。

    #include

    /*别偷懒,下面的"..."代表函数体,自己加上去哦!*/
    void bubble(int *a,int n)
    {
    ...
    }
    void choise(int *a,int n)
    {
    ...
    }
    void quick(int *a,int i,int j)
    {
    ...
    }
    void insert(int *a,int n)
    {
    ...
    }
    void shell(int *a,int n)
    {
    ...
    }

    /*为了打印方便,我们写一个print吧。*/
    void print(int *a,int n)
    {
    int i;
    for(i=0;i<n;i++)
    printf("%5d",a[i]);
    printf("\n");
    }

    main()
    { /*为了公平,我们给每个函数定义一个相同数组*/
    int a1[]={13,0,5,8,1,7,21,50,9,2};
    int a2[]={13,0,5,8,1,7,21,50,9,2};
    int a3[]={13,0,5,8,1,7,21,50,9,2};
    int a4[]={13,0,5,8,1,7,21,50,9,2};
    int a5[]={13,0,5,8,1,7,21,50,9,2};

    printf("the original list:");
    print(a1,10);
    printf("according to bubble:");
    bubble(a1,10);
    print(a1,10);
    printf("according to choise:");
    choise(a2,10);
    print(a2,10);
    printf("according to quick:");
    quick(a3,0,9);
    print(a3,10);
    printf("according to insert:");
    insert(a4,10);
    print(a4,10);
    printf("according to shell:");
    shell(a5,10);
    print(a5,10);
    }



    展开全文
  • C语言 排序算法

    2019-11-25 18:50:00
    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。 过程演示: 选择排序 选择排序...

    冒泡排序

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。

    过程演示:

     

    选择排序

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    过程演示:

     

    插入排序

    插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到 {\displaystyle O(1)} {\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后

    挪位,为最新元素提供插入空间。

     

    过程演示:

     

    希尔排序

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:

    • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
    • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

    过程演示:

     

    归并排序

    把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。

    可从上到下或从下到上进行。

    过程演示:

     

    快速排序

    在区间中随机挑选一个元素作基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后,再分别对小数区与大数区进行排序。

    过程演示:

     

    展开全文
  • 主要为大家详细介绍了C语言排序算法之插入排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了C语言排序算法之冒泡排序实现方法,结合具体实例形式分析了C语言实现的基本冒泡排序实现方法及增设flag标志位的改进型算法,需要的朋友可以参考下
  • 本文给大家分享两种常用的C语言排序算法,代码非常简单,感兴趣的朋友可以参考下
  • 插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在...

    插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。

    很多初学者所说的插入排序,实际上指的就是直接插入排序算法,插入排序算法还包括折半插入排序2-路插入排序表插入排序希尔排序等,后序文章都会一一讲到。

    例如采用直接插入排序算法将无序表{3,1,7,5,2,4,9,6}进行升序排序的过程为:

    • 首先考虑记录 3 ,由于插入排序刚开始,有序表中没有任何记录,所以 3 可以直接添加到有序表中,则有序表和无序表可以如图 1 所示:

      1a59ff9d916a1bcc4cb3c49a26654bf5.png图 1 直接插入排序(1)

    • 向有序表中插入记录 1 时,同有序表中记录 3 进行比较,1<3,所以插入到记录 3 的左侧,如图 2 所示:

      1935eb9729aa338a271bcdfbb4b3778f.png图 2 直接插入排序(2)

    • 向有序表插入记录 7 时,同有序表中记录 3 进行比较,3<7,所以插入到记录 3 的右侧,如图 3 所示:

      7361d660420284197f84be00c1ad0233.png图 3 直接插入排序(3)

    • 向有序表中插入记录 5 时,同有序表中记录 7 进行比较,5<7,同时 5>3,所以插入到 3 和 7 中间,如图 4 所示:

      eedb836d2189c186ca36df22c4511b6d.png图 4 直接插入排序(4)

    • 向有序表插入记录 2 时,同有序表中记录 7进行比较,2<7,再同 5,3,1分别进行比较,最终确定 2 位于 1 和 3 中间,如图 5 所示:

      22b014c7a1aee0bb642ba2731a5c5f91.png图 5 直接插入排序(5)

    • 照此规律,依次将无序表中的记录 4,9 和 6插入到有序表中,如图 6 所示:

      ad247776b5ffbd1e3d42e96c1b9ed723.png图 6 依次插入记录4,9和6

    直接插入排序的具体代码实现为:

    #include //自定义的输出函数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        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;}

    运行结果为:

    1:13752496
    2:13752496
    3:13572496
    4:12357496
    5:12345796
    6:12345796
    7:12345679

    直接插入排序算法本身比较简洁,容易实现,该算法的时间复杂度O(n2)

    插入排序的其它 4 种排序方法,在后序章节中有详细介绍。

    dc330f71cc66e4ed68f342f052b85d59.png

    展开全文
  • C语言排序算法.zip

    2020-04-14 15:52:58
    包括7种排序 直接插入排序、希尔排序、快速排序、简单选择排序、堆排序、归并排序、基数排序C语言实现。
  • 上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿。今天来分享一下选择排序算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从剩余...
  • 插入排序就像是在打牌时,起牌过程中,你对手里的牌进行排序一样,想象一下这个过程,当你起到一张8,你往手里牌放的时候,要找到9和7的位置(类似的如果没有9...算法代码:void insertion_sort(int arr[], int n){ ...
  • (c语言排序算法)sort.c

    2020-12-24 11:04:29
    排序算法:直接插入、折半插入排序、希尔排序、冒泡、快排、选择排序、堆排序、归并排序算法c语言实现,带有简要的注释(并非详解)
  • c语言排序算法 动画效果展示

    千次阅读 2013-10-13 20:12:56
    c语言排序算法可视化展示地址---手动查看版本:http://www.sorting-algorithms.com/ c语言排序算法可视化展示地址---视频制作版本:http://v.youku.com/v_show/id_XNjIwNTEzMTA0.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,518
精华内容 2,607
关键字:

c语言排序算法

c语言 订阅