欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C中排序(代码实例)

程序员文章站 2023-01-24 19:13:19
c中排序(代码实例) /*********************冒泡排序********************/ #include #include&l...

c中排序(代码实例)

/*********************冒泡排序********************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<math.h>
#include<sys/types.h>

void maopao(int *a,int n)
{
    int i,j,temp;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(a[j]>a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}
void show(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%-3d",a[i]);
    }
    printf("\n");
}
int main (void)
{
    int a[10] = {12,23,10,14,8,22,43,1,3,0}; 
    maopao(a,10);
    show(a,10);

    return 0;
}
/***********************************选择排序***********************************/

void choise(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;
            }
        }
    }
}
void show(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%-3d",a[i]);
    }
    printf("\n");
}
int main (void)
{
    int a[10] = {10,14,8,22,94,95,4,5,6,1}; 
    choise(a,10);
    show(a,10);

   return 0;
}

/*******************************************插入排序********************************************/

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

void insert(int *a,int n)
{
    int i,j,temp;
    for(i=1;i<n;i++)
    {
        temp = a[i];/*temp为要插入的元素*/ 
        j = i - 1;
        /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/
        while(j>=0 && temp<a[j])
        {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = temp;/*插入*/ 
    }
}

void show(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%-3d",a[i]);
    }
    printf("\n");
}
int main (void)
{
    int a[10] = {12,2,4,67,32,45,22,11,90,15}; 
    insert(a,10);
    show(a,10);

    return 0;
}

/**************************************快速排序**************************************************/

*        快速排序
 * 快速法定义了三个参数,
 * (数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j)
 * 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,
 * 把比它小的元素放到它的左边,比它大的放在右边。
 * 然后运用递归,在将它左,右两个子数组排序,
 * 最后完成整个数组的排序。
 * */
void quick(int *a,int i,int j) 
{ 
    int m,n,temp; 
    int k; 
    m=i; 
    n=j; 
    k=a[(i+j)/2]; /*选取的参照*/ 
    while(m<=n)
    { 
        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--; 
                 } 
    } 
    if(m<j) quick(a,m,j); /*运用递归*/ 
    if(n>i) quick(a,i,n); 
} 
int show(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%-3d",a[i]);
    }
    printf("\n");
    return 0;
}
int main (void)
{
    int a[10] = {23,13,1,4,2,56,78,22,10,3};
    quick(a,0,9);
    show(a,10);

    return 0;
}
/*********************************************shell排序***********************************************************/


/*shell法
 shell法是一个叫 shell 的美国人与1969年发明的。
它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半) 
 再排序,直到k=1时完成排序。下面让我们来分析其代码
 */
void shell(int *a,int n)
{
    int i,j,k,temp;
    k = n/2;
    while(k>=1)
    { 
        for(i=k;i<n;i++) { 
            temp = a[i]; 
            j=i-k; 
            while(j>=0 && temp<a[j]) { 
                a[j+k]=a[j]; 
                j-=k; 
            } 
            a[j+k]=temp; 
        } 
        k/=2; /*缩小间距值*/ 
    } 
}
void show(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%-3d",a[i]);
    }
    printf("\n");
}
int main (void)
{
    int a[10] = {12,19,95,94,10,14,8,22,1,4};
    shell(a,10);
    show(a,10);

    return 0;
}