zoukankan      html  css  js  c++  java
  • 插入,选择,归并,快速排序

    插入排序:

    插入排序在最坏情况和平均情况下时间复杂度是Θ(n2)

    #include <stdio.h>
    #define LEN 5
    
    int a[LEN] = {10, 5, 2, 4, 7};
    
    void print(void)
    {
        for (int i = 0; i < LEN; i++)
            printf(" %d", a[i]);
        printf("
    ");
    }
    
    void insertion_sort(void) //该算法要求背诵
    {
        int j, key;
        for (int i = 1; i < LEN; i++)
        {
            print();
            key = a[i];
            
            for (j = i - 1; j >= 0 && a[j] > key; j--)
                a[j + 1] = a[j];
    
            a[j + 1] = key;
        }
        print();
    }
    
    int main(void)
    {
        insertion_sort();
        return 0;
    }

    选择排序:

    #include <stdio.h>
    #define LEN 5
    
    int a[LEN] = {10, 5, 2, 4, 7};
    
    void print(void)
    {
        for (int i = 0; i < LEN; i++)
            printf(" %d", a[i]);
        printf("
    ");
    }
    
    void selection_sort(void) //该算法要求背诵
    {
        int min, low;
        for (int i = 0; i < LEN - 1; i++)
        {
            print();
            min = a[i];
            low = i;
            for (int j = i + 1; j < LEN; j++)
            {
                if (a[j] < min)
                {
                    min = a[j];
                    low = j;
                }
            }
            a[low] = a[i];
            a[i] = min;
        }
        print();
    }
    
    int main(void)
    {
        selection_sort();
        return 0;
    }

    归并排序:

     1 #include <stdio.h>
     2 #define LEN 8
     3 int a[LEN] = {5, 2, 4, 7, 1, 3, 2, 6};
     4 
     5 void merge(int start, int mid, int end)
     6 {
     7     int n1 = mid - start + 1; // mid - start + 1
     8     int n2 = end - mid;          // end - (mid+1) + 1
     9     int left[n1], right[n2];
    10 
    11     //分别将a数组的左半部分和右半部分,拷贝到left和right数组
    12     for (int i = 0; i < n1; i++) /* left holds a[start..mid] */
    13         left[i] = a[start + i];
    14     for (int j = 0; j < n2; j++) /* right holds a[mid+1..end] */
    15         right[j] = a[mid + 1 + j];
    16 
    17     //归并操作,将排序完毕的left和right中较小的切片拷贝到a数组
    18     int i = 0, j = 0, k = start;
    19     while (i < n1 && j < n2)
    20     {
    21         if (left[i] < right[j])
    22         {
    23             a[k] = left[i];
    24             k++, i++; //这两条语句等价于a[k++] = left[i++];
    25         }
    26         else
    27         {
    28             a[k] = right[j];
    29             k++, j++; //这两条语句等价于a[k++] = right[j++];
    30         }
    31     }
    32 
    33     //经过上一步的归并,将left或者right中剩余的部分拷贝至a数组
    34     while (i < n1)            /* left[] is not exhausted */
    35         a[k++] = left[i++];   /* 循环体的展开形式同上 */
    36     while (j < n2)            /* right[] is not exhausted */
    37         a[k++] = right[j++];
    38 }
    39 
    40 void print(void)
    41 {
    42     for (int i = 0; i < LEN; i++)
    43         printf(" %d", a[i]);
    44     printf("
    ");
    45 }
    46 
    47 void sort(int start, int end)
    48 {
    49     int mid;
    50     if (start < end)
    51     {
    52         mid = (start + end) / 2;
    53         printf("sort (%d-%d, %d-%d)", start, mid, mid + 1, end);
    54         print();
    55 
    56         sort(start, mid);
    57         sort(mid + 1, end);
    58         merge(start, mid, end);
    59 
    60         printf("merge (%d-%d, %d-%d)", start, mid, mid + 1, end);
    61         print();
    62     }
    63 }
    64 
    65 int main(int argc, char const *argv[])
    66 {
    67     sort(0, LEN - 1);
    68     return 0;
    69 }

    快速排序:

     1 #include <stdio.h>
     2 #define LENGTH 8
     3 
     4 int a[LENGTH] = {5, 2, 4, 7, 1, 3, 8, 6};
     5 
     6 int partition(int, int);
     7 void quicksort(int, int);
     8 
     9 void quicksort(int start, int end)
    10 {
    11 
    12     if (start < end)
    13     {
    14         int mid = partition(start, end);
    15         quicksort(start, mid - 1);
    16         quicksort(mid + 1, end);
    17     }
    18 }
    19 
    20 int partition(int start, int end)
    21 {
    22     int pivot = a[end];
    23 
    24     while (start < end)
    25     {
    26         while (start < end && a[start] <= pivot)
    27             start++;
    28         a[end] = a[start];
    29 
    30         while (start < end && a[end] >= pivot)
    31             end--;
    32         a[start] = a[end];
    33     }
    34 
    35     a[start] = pivot;
    36     return start;
    37 }
    38 
    39 int main(int argc, char const *argv[])
    40 {
    41     for (int i = 0; i < LENGTH; i++)
    42         printf(" %d", a[i]);
    43     printf("
    ");
    44 
    45     quicksort(0, LENGTH - 1);
    46 
    47     for (int i = 0; i < LENGTH; i++)
    48         printf(" %d", a[i]);
    49     printf("
    ");
    50 
    51     return 0;
    52 }
  • 相关阅读:
    冲突域和广播域的区分
    internet 的一词多义
    大神洗礼第四讲——函数相关及编程技巧
    旋转字符串算法由浅入深
    一个交换程序的通用版本
    想起一些事情,都很遥远
    [转载]创业感想
    [转载]javascript小技巧
    [转载]在Asp.Net 2.0中应用DataFormatString
    [转载]C#的String.Format格式化举例
  • 原文地址:https://www.cnblogs.com/echo1937/p/10134311.html
Copyright © 2011-2022 走看看