代码改变世界

三种排序算法

2013-04-10 20:44  Keiven_LY  阅读(322)  评论(0编辑  收藏  举报

1、冒泡排序

说明:

      设待排序记录序列中的记录个数为n

      一般地,第i趟起泡排序从1到n-i+1

      依次比较相邻两个记录的关键字,如果发生逆序,则交换之

      其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟

 程序代码:

#include <stdio.h>
main()
{  
    int a[11],i,j,t;
    printf("Input 10 numbers:\n");
    for(i=1;i<11;i++)
       scanf_s("%d",&a[i]);
    printf("\n");
    for(j=1;j<=9;j++)
       for(i=1;i<=10-j;i++)
          if(a[i]>a[i+1])
         {t=a[i]; a[i]=a[i+1]; a[i+1]=t;}
    printf("The sorted numbers:\n");
    for(i=1;i<11;i++)
    printf("%d ",a[i]);

}

运行结果:

按ctrl+F5,出现命令框

输入10个整数如下

敲回车

按任意键后,命令框消失。

2、快速排序

注:快速排序与冒泡排序类似,都是基于交换排序思想,是冒泡排序的改进 

算法描述:

  1. 首先设定一个分界值,提高该分界值将数组分成左右两部分
  2. 将大于等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值
  3. 然后,左边和右边的数据可以再独立排序。对于左侧的数据,又可以去一个分界值,将该部分的数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以类似处理
  4. 重复上述过程,可以看出,这是一个递归过程。

算法实例:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 18

void QuickSort(int *arr, int left, int right)
{
    int f,t;
    int rtemp,ltemp;

    ltemp=left;
    rtemp=right;
    f=arr[(left+right)/2];   //将中间值作为分界值
    while(ltemp<rtemp)
    {
        while(arr[ltemp]<f)
        {
            ++ltemp;
        }
        while(arr[rtemp]>f)
        {
            --rtemp;
        }
        if(ltemp<=rtemp)
        {
            t=arr[ltemp];
            arr[ltemp]=arr[rtemp];
            arr[rtemp]=t;
            --rtemp;
            ++ltemp;
        }
    }
    if(ltemp==rtemp)
    {
        ltemp++;
    }
    if(left<rtemp)
    {
        QuickSort(arr,left,ltemp-1);   //递归调用
    }
    if(ltemp<right)
    {
        QuickSort(arr,rtemp+1,right);  //递归调用
    }
}


void main()
{
    int i;
    int shuzu[SIZE];

    srand(time(NULL));  //初始化数组
    for(i=0;i<SIZE;i++)
    {
        shuzu[i]=rand()/1000+100;  //随机产生个三位数的随机数,存在数组arr中
    }


    printf("排序前:\n");
    for(i=0;i<SIZE;i++)
    {
        printf("%d \0",shuzu[i]);
    }
    printf("\n");

    QuickSort(shuzu,0,SIZE-1);    //调用函数QuickSort,对数组进行排序

    printf("排序后:\n");
    for(i=0;i<SIZE;i++)
    {
        printf("%d \0",shuzu[i]);
    }
    printf("\n");

}

运行结果:

3、选择排序法

算法描述

  1. 首先从原始数据中选择最小的一个数据,将其和位于第一个位置的数据交换
  2. 接着从剩下的n-1个数据中选择次小的一个元素,将其和位于第二个位置的数据交换
  3. 然后,这样不断重复,知道最后两个数据交换完成。

 算法实例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

void SelectionSort(int *a,int len)
{
    int i,j,k,h;
    int temp;


    for(i=0;i<len-1;i++)
    {
        k=i;
        for(j=i+1;j<len;j++)
        {
            if(a[j]<a[k])
                k=j;
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }

        printf("第%d步排序结果:",i);

        for(h=0;h<len;h++)
        {
            printf("%d \0",a[h]);
        }

        printf("\n");
    }
}


void main()
{
    int i;
    int shuzu[SIZE];

    srand(time(NULL));  //初始化数组
    for(i=0;i<SIZE;i++)
    {
        shuzu[i]=rand()/1000+100;  //随机产生个三位数的随机数,存在数组arr中
    }


    printf("排序前:\n");
    for(i=0;i<SIZE;i++)
    {
        printf("%d \0",shuzu[i]);
    }
    printf("\n");


    SelectionSort(shuzu,SIZE);

    printf("排序后:\n");
    for(i=0;i<SIZE;i++)
    {
        printf("%d \0",shuzu[i]);
    }
    printf("\n");
}

运行结果: