• 一些数组排序算法的简单实现(冒泡、插入、希尔、归并和qsort)


    #include <stdlib.h>
    #include <string.h>
    #include "sort.h"
    
    //冒泡排序
    int bubbleSort(int a[], int n)
    {
        int i, j;
        for (i=n-1; i>=0; i--)
        {
            for (j=0; j<i; j++)
            {
                if (a[j]>a[j+1])
                {//交换a[i]和a[j],也可使用临时变量实现
                    a[j] += a[j+1];
                    a[j+1] = a[j] - a[j+1];
                    a[j] = a[j] - a[j+1];
                }
            }
        }
        return 0;
    }
    
    /***********编译器自带快排************/
    int cmp(const void * a, const void * b)
    {
        return *(int *)a - *(int *)b;
    }
    
    int quickSortC(int a[], int n)
    {
        qsort(a, n, sizeof(a[0]), cmp);
        return 0;
    }
    /***********编译器自带快排************/
    
    
    //直接插入排序
    int insertSort(int a[], int n)
    {
        int i, j, k, tmp;
        for (i=1; i<n; i++)
        {
            for (j=0; j<i; j++)
            {
                if (a[i]<a[j])//insert a[i] before a[j]
                {
                    tmp = a[i];
                    for (k=i; k>j; k--)
                    {
                        a[k] = a[k-1];    
                    }
                    a[j] = tmp;
                }
            }
        }
        return 0;
    }
    
    //希尔排序(无监视哨,迭代,也可递归实现)
    int shellSort(int a[], int n)
    {
        int i, j, k, tmp, group = 0, step = n/2;
        while (step > 0)
        {
            for (i=group+step; i<n; i+=step)
            {
                tmp = a[i];
                for (j=group; j<i; j+=step)
                {
                    if (a[j]>a[i])
                    {
                        for (k=i; k>j; k-=step)
                        {
                            a[k] = a[k-step];
                        }
                        a[j] = tmp;
                    }
                }
            }
            step /= 2;
        }
        return 0;
    }
    
    
    
    /*
    归并排序,鼓捣了半天,还是写成两个子函数的明了
    */
    int merge(int a[], int m, int b[], int n, int arr[])
    {
        int i=0, j=0, k=0;
        while (i<m && j<n)
        {
            arr[k++] = a[i]<b[j] ? a[i++] : b[j++];
        }
        if (i<m)
        {
            memcpy(&arr[k], &a[i], (m-i)*sizeof(int));
        }
        else if(j<n)
        {
            memcpy(&arr[k], &b[j], (n-j)*sizeof(int));
        }
        return 0;
    }
    
    int mergeSort(int a[], int len)
    {
        int i, j, k, step, g1, g2, m, n;
        int * arr = (int *)malloc(sizeof(int)*len);
        
        for (step=1; step<=len; step<<=1)
        {//
            g1 = 0;
            g2 = g1 + step;
            k = 0;
            memcpy(arr, a, len*sizeof(int));
            for (i=g1,j=g2; g1<len; g1=g2+step, g2=g1+step)
            {
                //先处理不足两组的情况,即g2>=len的情况
                m = g2<len ? step : len-g1;
                n = g2+step<len ? step : len-g2;
                if (g2>=len)//剩余末尾分组
                {
                    memcpy(&a[k], &arr[g1], m*sizeof(int));
                    k += m;
                    break;
                }
                if(merge(&arr[g1], m, &arr[g2], n, &a[k]))
                {
                    free(arr);
                    return 1;
                }
                k += m+n;
            }
        }
        free(arr);
        return 0;
    }
  • 相关阅读:
    Silverlight文本元素—高级修饰
    C#常用集合总结2
    Silverlight图片处理——(伸展,裁剪,蒙版)
    选择“Asp.Net Web应用程序”还是“Asp.Net网站”?
    HTML5能给软件初学者带来什么呢?
    性格的弱点
    (原)jvoiplib中的examples的编译和运行
    开源的好东西
    C++编绎器编绎C语言的问题
    gcc生成静态库和动态库(转自http://blog.csdn.net/ast_224/archive/2009/03/13/3988244.aspx)
  • 原文地址:https://www.cnblogs.com/weir007/p/5868012.html
Copyright © 2020-2023  润新知