插入,归并,快速,冒泡,shell,选择排序 用c实现

来源:互联网 发布:淘宝管控记录违规记录 编辑:程序博客网 时间:2024/06/06 09:18

插入:

#include<stdio.h>

int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j,k;
    for( i=1;i < 10;i++)
    {
        k = a[i];
        for(j=i-1;a[j] > k && j > -1; j--)
        {
            a[j+1] = a[j];
        }
        a[j+1] = k;
    }
    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;

}

归并:

#include<stdio.h>
void hebing(int *a,int start,int mid,int end);
void guibing_sort(int *a, int start, int end)// 排序
{
    int mid;
    if(start < end)
    {
        mid = (start + end)/2;


        guibing_sort(a,start,mid);
        guibing_sort(a,mid+1,end);
        hebing(a,start,mid,end);
    }
}


//合并
void hebing(int *a,int start,int mid,int end)
{
    int s1 = mid - start + 1;
    int s2 = end - mid;
    int left[s1];
    int right[s2];
    int i,j,k;
    for(i = 0; i < s1; i++)
    {
        left[i] = a[start + i];
    }
    for(i = 0; i < s1; i++)
    {
        right[i] = a[mid + 1 + i];
    }
    i = 0;j = 0;k = start;
    while(i < s1 && j < s2)
    {
        if(left[i] < right[j])
        {
            a[k++] = left[i++];
        }
        else
        {
            a[k++] = right[j++];
        }
    }
    while(i < s1)
    {
        a[k++] = left[i++];
    }
    while(j < s2)
    {
        a[k++] = right[j++];
    }
}


int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j;
    guibing_sort(a,0,9);


    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}


快速:

#include<stdio.h>
void quick(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) quick(a,m,j); /*运用递归*/ 
    if(n>i) quick(a,i,n); 



int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j;
    quick(a,0,9);
    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}


冒泡:

#include<stdio.h>
int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j;
    for( i=0;i < 9;i++)
    {
        for(j=0;j < 9-i; j++)
        {
            if(a[j] > a[j+1])
            {
                a[j] ^= a[j+1];
                a[j+1] ^= a[j];
                a[j] ^= a[j+1];
            }
        }
    }
    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}



shell:

#include<stdio.h>
/*分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&&x<a[j])
             { 
                 a[j+k]=a[j]; 
                 j-=k; 
             } 
             a[j+k]=x; 
         } 
         k/=2; /*缩小间距值*/ 
     } 
 }  


int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j;
    shell(a,9);
    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}


选择:

#include<stdio.h>
int main()
{
    int a[10] = {1,5,2,3,8,9,7,0,4,4};
    int i,j,k;
    for( i=0;i < 9;i++)
    {
        k = i;
        for(j = i+1;j < 10; j++)
        {
            if(a[k] > a[j])
            {
                k = j;
            }
        }
        if(k != i)
        {
            a[k] ^= a[i];
            a[i] ^= a[k];
            a[k] ^= a[i];
        }
    }
    for(i = 0; i< 10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

阅读全文
0 0
原创粉丝点击