• 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现


    另外还有基数排序,计数排序,桶排序等,暂时没有时间看。先把上面这些的c语言代码写一下,并且简略提一下原理。

    插入排序:对于未排序的数据,在已排序数据中从后向前扫描,找到相应位置插入.(第一个元素当做已排序)扫描过程中需要反复把已排序的元素逐步向后移动,为新元素提供插入空间。

     1 void insertion_sort(int *a, int len)        //调用insertion_sort(a, len)
     2 {
     3     int i, j, key;                            //key是待排序数
     4     for (i = 1; i < len; ++i)
     5     {
     6         key = a[i];
     7         j = i - 1;
     8         while (j >= 0 && key < a[j])        //逐个后移
     9         {
    10             a[j+1] = a[j];
    11             --j;
    12         }
    13         a[j+1] = key;
    14     }
    15 }

    选择排序:首先找到数组a中最小元素与a【1】交换,再次小元素与a【2】交换,对a中前n-1个元素继续此过程。

    void selection_sort(int *a, int len)        //调用selection_sort(a, len)
    {
        int i, j, k, t;
        for (i = 0; i < len - 1; ++i)
        {
            k = i;
            for (j = i + 1; j < len; ++j)
                if (a[k] > a[j])
                    k = j;
            t = a[i];
            a[i] = a[k];
            a[k] = t;
        }
    }

    归并排序:

     1 void merge(int *a, int *temp_array, int lpos, int rpos, int right_end)
     2 {
     3     int i, left_end, num_element, tmp_pos;
     4     left_end = rpos - 1;    
     5     tmp_pos = lpos;
     6     num_element = right_end - lpos + 1;
     7     while (lpos <= left_end && rpos <= right_end)
     8     {
     9         if (a[lpos] <= a[rpos])
    10             temp_array[tmp_pos++] = a[lpos++];
    11         else
    12             temp_array[tmp_pos++] = a[lpos++];
    13     }
    14     while (lpos <= left_end)
    15         temp_array[tmp_pos++] = a[lpos++];
    16     while (rpos <= right_end)
    17         temp_array[tmp_pos++] = a[rpos++];
    18     for (i = 0; i < num_element; ++i, right_end--)
    19         a[right_end] = temp_array[right_end];
    20 }
    21 void merge_sort(int *a, int *temp_array, int left, int right) //调用merge_sort(a, t, 0, len - 1)
    22 {
    23     int mid;
    24     if (left < right)
    25     {
    26         mid = (left + right) / 2;
    27         merge_sort(a, temp_array, left, mid);
    28         merge_sort(a, temp_array, mid + 1, right);
    29         merge(a, temp_array, left, mid + 1, right);
    30     }
    31 }


    冒泡排序:重复交换相邻的两个反序元素。
     1 void bubble_sort(int *a, int len)
     2 {
     3     int i, j, t;
     4     for (i = 0; i < len; ++i)
     5         for (j = len - 1; j > i; --j)
     6             if (a[j] < a[j-1])
     7             {
     8                 t = a[j];
     9                 a[j] = a[j-1];
    10                 a[j-1] = t;
    11             }
    12 }

    希尔排序(shell):缩小增量排序,将待排序列划分为若干个较小的序列,分别进行直接插入排序,是需要排序的数列基本有序,最后再用依稀直接插入排序。一般取上一增量的一半作为此次划分的增量,直到增量为1.

     1 void shell_sort(int *a, int len)
     2 {
     3     int gap, i, j, t;
     4     for (gap = len / 2; gap > 0; gap /= 2)
     5         for (i = gap; i < len; ++i)
     6             for (j = i - gap; j >=0 && a[j] > a[j+gap]; j -= gap)
     7             {
     8                 t = a[j];    a[j] = a[j+gap];    a[j+gap] = t;
     9             }
    10 }

    堆排序:

     1 void swap(int *a, int *b)
     2 {
     3     int t = *a;    *a = *b; *b = t;
     4 }
     5 void max_heapify(int *a, int i, int heapsize)
     6 {
     7     int l = 2 * i + 1;
     8     int r = 2 * i + 2;
     9     int largest;
    10     if (l <= heapsize - 1 && a[l] > a[i])
    11         largest = l;
    12     else
    13         largest = i;
    14     if (r <= heapsize - 1 && a[r] > a[i])
    15         largest = r;
    16     if (largest != i)
    17     {
    18         swap(&a[i], &a[largest]);
    19         max_heapify(a, largest, heapsize);
    20     }
    21 }
    22 void build_max_heap(int *a, int heapsize)
    23 {
    24     int i;
    25     for (i = heapsize / 2 - 1; i >= 0; --i)
    26         max_heapify(a, largest, heapsize);
    27 }
    28 void heap_sort(int *a, int len)
    29 {
    30     int i;
    31     build_max_heap(a, len);
    32     for (i = len - 1; i >= 1; --i)
    33     {
    34         swap(&a[0], &a[i]);
    35         max_heapify(a, 0, i);
    36     }
    37 }

     快速排序:

    void swap(int *a, int *b)
    {
        int t = *x; *x = *y; *y = t;
    }
    int partition(int *a, int p, int r)
    {
        int x = a[r];
        int i = p - 1;
        int j;
        for (j = 0; j <= r - 1; ++j)
        {
            if (a[j] <= x)
            {
                ++i;
                swap(&a[i], &a[j]);
            }
        }
        swap(&a[i+1], &a[r]);
        return i + 1;
    }
    void quick_sort(int *a, int p, int r)        //调用(a, 0, len - 1)
    {
        if (p < r)
        {
            int q = partition(a, p, r);
            quick_sort(a, p, q - 1);
            quick_sort(a, q + 1, r);
        }
    }
  • 相关阅读:
    【Problem】前端项目运行:Module build failed:Error Node Sass does not yet support my current environmen
    element ui源码解析 -- Pagination篇( 副:列表页进入详情页再返回后,如何保持当前页码正确 )
    vue mixins是什么及应用
    bootstrap fileinput实现限制图片上传数量及如何控制分批多次上传
    fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考
    provide inject应用及和props对比
    element ui源码解析 -- input篇
    vue指令应用--实现输入框常见过滤功能
    vue项目实现导出数据到excel
    组件绑定v-model,实现最大化复用
  • 原文地址:https://www.cnblogs.com/PegasusWang/p/3080907.html
Copyright © 2020-2023  润新知