• 排序算法总结


    1. 快排

    详见之前博文快速排序算法

    2. 堆排序

    详见之前博文非递归方法的堆排序实现

    3. 简单排序(冒泡排序、选择排序和插入排序)

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 20
    
    static void show(int *arr, int len)
    {
        int index;
        for(index = 0; index < len; index++)
        {
            printf("%d ", arr[index]);
        }
        printf("
    ");
    }
    
    static void swap(int *left, int *right)
    {
        int tmp = *left;
        *left = *right;
        *right = tmp;
    }
    
    /**
     * 选择排序思想:依次将未排序的数组中的最小数放入pos所在位置,pos从0至N-1
     * -->前N-1个数放好位置,最后一个数就不用管了
     */
    static void select_sort(int *arr, int len)
    {
        int pos,index;
        int min_index;
        for(pos = 0; pos < len - 1; pos++)
        {
            min_index = pos;
            for(index = pos + 1; index < len; index++)
            {
                if(arr[index] < arr[min_index])
                    min_index = index;
            }
            if(min_index != pos)
            {
                swap(arr + pos, arr + min_index);
            }
        }
    }
    
    static void insert_sort(int *arr, int len)
    {
        int pos,index;
        int key;
        for(pos = 1; pos < len; pos++)
        {
            key = arr[pos];
            for(index = pos - 1; index >= 0; index--)
            {
                if(key < arr[index])
                {
                    arr[index+1] = arr[index];
                }else
                {
                    break;
                }
            }
            arr[index+1] = key;
        }
    }
    
    static void bubble_sort(int *arr, int len)
    {
        int pos,index;
        for(pos = 0; pos < len - 1; pos++)
        {
            for(index = 0; index < len - 1 - pos; index++)
            {
                if(arr[index] > arr[index + 1])
                {
                    swap(arr + index, arr + index + 1);
                }
            }
        }
    }
    
    static void bubble_sort2(int *arr, int len)
    {
        int left, right, index;
        left = 0;
        right = len - 1;
    
        while(left < right)
        {
            for(index = left; index < right; index++)
            {
                if(arr[index] > arr[index+1])
                {
                    swap(arr+index, arr+index+1);
                }
            }
            right--;
            if(left == right)
            {
                break;
            }
            for(index = right; index > left; index--)
            {
                if(arr[index] < arr[index-1])
                {
                    swap(arr + index, arr + index -1);
                }
            }
            left++;
        }
    }
    
    int main(int argc, char *argv[])
    {
        int arr[N], index;
        srand(time(NULL));
        for(index = 0; index < N; index++)
        {
            arr[index] = rand()%100 + 1;
        }
        show(arr, N);
        bubble_sort2(arr, N);
        show(arr, N);
        system("pause");
        return 0;
    }

    4. 归并排序

    示意图:

    QQ截图20140907160527

    代码如下:

    /**
     * 归并排序
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 20
    
    void merge(int arr[],int start,int mid,int end)
    {
        int i,j,k;
        int n1 = mid - start + 1;
        int n2 = end - mid;
        int *left = (int *)malloc(sizeof(int) * n1);
        int *right = (int *)malloc(sizeof(int) * n2);
    
        for(i = 0; i < n1; i++)
            left[i] = arr[start + i];
        for(j = 0; j < n2; j++)
            right[j] = arr[mid+1+j];
        i = 0;
        j = 0;
        k = start;
        while(i < n1 && j < n2)
        {
            if(left[i] < right[j])
                arr[k++] = left[i++];
            else
                arr[k++] = right[j++];
        }
        while(i < n1)
            arr[k++] = left[i++];
        while(j < n2)
            arr[k++] = right[j++];
        free(left);
        free(right);
    }
    
    void sort(int arr[], int start, int end)
    {
        int mid;
        if(start < end)
        {
            mid = (start + end) / 2;
            sort(arr, start, mid);
            sort(arr, mid+1, end);
            merge(arr,start,mid,end);
        }
    }
    
    int main(int argc, char * argv[])
    {
        int i,a[N];
        srand(time(NULL));
        for(i = 0; i < N; i++)
            a[i] = rand() % 100;
        printf("归并排序:
    ");
        printf("before : ");
        for(i = 0; i < N; i++)
            printf("%-2d ",a[i]);
        printf("
    ");
        
        sort(a,0,N-1);
        
        printf("after  : ");
        for(i = 0; i < N; i++)
            printf("%-2d ",a[i]);
        printf("
    ");
        system("pause");
        return 0;
    }

    方法2:用数组名以及数组长度作参数。如此一来,与之前的排序算法参数就统一起来了。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    static void show(int *arr, int len)
    {
        int index;
        for(index = 0; index < len; index++)
        {
            printf("%3d", arr[index]);
        }
        printf("
    ");
    }
    
    static void merge(int *arr, int len)
    {
        
        int index,i,j;
        int n1 = len / 2;
        int n2 = len - n1;
        int *left  = (int*)calloc(n1, sizeof(int));
        int *right = (int*)calloc(n2, sizeof(int));
        i = j = 0;
    
        for(index = 0; index < n1; index++)
        {
            left[i++] = arr[index];
        }
        for(; index < len; index++)
        {
            right[j++] = arr[index];
        }
        
        index = i = j = 0;
        while(i < n1 && j < n2)
        {
            if(left[i] < right[j])
            {
                arr[index++] = left[i++];
            }else
            {
                arr[index++] = right[j++];
            }
        }
        while(i < n1)
        {
            arr[index++] = left[i++];
        }
        while(j < n2)
        {
            arr[index++] = right[j++];
        }
        
        free(left);
        free(right);
        left = right = NULL;
    }
    
    static void sort(int *arr, int len)
    {
        int n;
        if(len == 1)
        {
            return;
        }else
        {
            n = len/2;
            sort(arr, n);
            sort(arr + n, len-n);
            merge(arr,len);
        }    
    }
    
    int main(int argc, char *argv[])
    {
        int arr[20],i;
        srand(time(NULL));
        for(i = 0; i < 20; i++)
        {
            arr[i] = rand()%100;
        }
        
        show(arr,20);
        sort(arr, 20);
        show(arr,20);
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    RESTful API 设计指南【转】
    一款 .NET 下的轻量级 REST 和 HTTP API 客户端
    Windows 服务开发框架介绍
    实例演示 kino.razor (前端 Javascript 模板工具,Razor 风格)的使用
    深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的
    扩展 IEnumerable<T>,让它根据另一个集合的顺序来排列
    谷歌正式发布Google APIs Client Library for .NET
    身为码农,为12306说两句公道话
    12306外包给阿里巴巴/IBM到底是否可行?
    自定义一个叫 ReadOnlyXmlMembershipProvider 的 MembershipProvider,用 XML 作为用户储藏室
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/3957823.html
Copyright © 2020-2023  润新知