• 算法5--排序


    主要是一些常见的排序方法的实现

    1 冒泡排序算法
     
    排序算法的理论和实现比较简单;
     
    对于冒泡排序算法的改进,一种比较好的方法是,每次中间排序之后,都进行排序状态检测,如果已经排好序,就退出排序过程,否则基于冒泡排序;
     
    但是:对于数组排序状态的检测,我没有比较好的办法;如果个数比较少,还可以容易得出,但是数组元素个数比较多的时候,该如何做?
     
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 #define SIZE 10
     6 
     7 int sortjudge(int *a,int len)
     8 {
     9     if (/* condition */)
    10     {
    11         /* code */
    12     }
    13 }
    14 void bubblesort(int *a,int len)
    15 {
    16     int temp;
    17     for (int i = 0; i < len-1; i++)
    18     {
    19         for (int j = len-1; j>i; j--)
    20         {
    21             if (a[j-1]>a[j])
    22             {
    23                 temp=a[j-1];
    24                 a[j-1]=a[j];
    25                 a[j]=temp;
    26             }
    27         }
    28         printf("the %d down sort answer :", i+1);
    29         for (int k = 0; k < len; k++)
    30         {
    31             printf("%d ", a[k]);
    32         }
    33         printf("
    ");
    34     }
    35 
    36 }
    37 
    38 
    39 int main()
    40 {
    41     int array[SIZE];
    42     srand(time(NULL));
    43     for (int i = 0; i < SIZE; i++)
    44     {
    45         array[i]=rand()/1000;
    46     }
    47     printf("before sort:
    ");
    48     for (int j = 0; j < SIZE; j++)
    49     {
    50         printf("%d ",array[j]);
    51     }
    52     printf("
    ");
    53     bubblesort(array,SIZE);
    54     printf("after sort:
    ");
    55     for (int k = 0; k < SIZE; k++)
    56     {
    57         printf("%d ",array[k]);
    58     }
    59     printf("
    ");
    60     return 0;
    61 }

    2 选择排序

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 #define SIZE 10
     6 
     7 void selectionsort(int *a , int len)
     8 {
     9     int temp;
    10     for (int i=0; i<len-1; i++)
    11     {
    12         int k=i;
    13         for (int j=i+1; j<len; j++)
    14         {
    15             if (a[j]<a[k])
    16             {
    17                 k=j;
    18             }
    19         }
    20         if (k!=i)
    21         {
    22             temp=a[i];
    23             a[i]=a[k];
    24             a[k]=temp;
    25         }
    26         printf("the %d sorted answer is :" , i+1);
    27         for (int m = 0; m<len; m++)
    28         {
    29             printf("%d",a[m]);
    30         }
    31         printf("
    ");
    32     }
    33 }
    34 
    35 
    36 int main()
    37 {
    38     int array[SIZE];
    39     srand(time(NULL));
    40     for (int i = 0; i < SIZE; i++)
    41     {
    42         array[i]=rand()/1000;
    43     }
    44     printf("before sort:
    ");
    45     for (int j = 0; j < SIZE; j++)
    46     {
    47         printf("%d ",array[j]);
    48     }
    49     printf("
    ");
    50     selectionsort(array,SIZE);
    51     printf("after sort:
    ");
    52     for (int k = 0; k < SIZE; k++)
    53     {
    54         printf("%d ",array[k]);
    55     }
    56     printf("
    ");
    57     return 0;
    58 }

    3  插入排序

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 #define SIZE 10
     6 
     7 void insertionsort(int *a,int len)
     8 {
     9     for (int i = 1; i < len; i++)
    10     {
    11         int t=a[i];
    12         int j=i-1;
    13         while(j>=0&&t<a[j])
    14         {
    15             a[j+1]=a[j];
    16             j--;
    17         }
    18         a[j+1]=t;
    19         printf("the %d step sort answer:", i);
    20         for (int k = 0; k < len; k++)
    21         {
    22             printf("%d ",a[k] );
    23         }
    24         printf("
    ");
    25     }
    26 }
    27 
    28 int main()
    29 {
    30     int array[SIZE];
    31 
    32     srand(time(NULL));
    33 
    34     for (int i = 0; i < SIZE; i++)
    35     {
    36         array[i]=rand()/1000+100;
    37     }
    38     printf("before sort:
    ");
    39     for (int j = 0; j < SIZE; j++)
    40     {
    41         printf("%d ",array[j]);
    42     }
    43     printf("
    ");
    44     insertionsort(array,SIZE);
    45     printf("after sort:
    ");
    46     for (int k = 0; k < SIZE; k++)
    47     {
    48         printf("%d ",array[k]);
    49     }
    50     printf("
    ");
    51     return 0;
    52 }

    4 shell排序

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define SIZE 10
    
    void shellsort(int *a,int len)
    {
        int times=0;
        for (int i = len/2; i >=1; i/=2)
        {
            for (int j = i; j < len; j++)
            {
                int temp=a[j];
                int k=j-i;
                while(k>=0&&temp<a[k])
                {
                    a[k+i]=a[k];
                    k-=i;
                }
                a[k+i]=temp;
            }
            times=times+1;
            printf("the %d steps answer:", times);
            for (int h = 0; h < len; h++)
            {
                printf("%d ",a[h]);
            }
            printf("
    ");
        }
    }
    int main()
    {
        int array[SIZE];
        srand(time(NULL));
        for (int i = 0; i < SIZE; i++)
        {
            array[i]=rand()/1000+100;
        }
        printf("before sort:
    ");
        for (int j = 0; j < SIZE; j++)
        {
            printf("%d ",array[j]);
        }
        printf("
    ");
        shellsort(array,SIZE);
        printf("after sort:
    ");
        for (int k = 0; k < SIZE; k++)
        {
            printf("%d ",array[k]);
        }
        printf("
    ");
        return 0;
    }

    5 快速排序

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 #define SIZE 10
     6 
     7 void exchange(int m,int n)
     8 {
     9     int temp=0;
    10     temp=m;
    11     m=n;
    12     n=temp;
    13 }
    14 
    15 int partion(int *a,int left,int right)
    16 {
    17     int x=a[right];
    18     int i=left;
    19     for (int j=left ; j <= right; j++)
    20     {
    21         if (a[j]<=x)
    22         {
    23             i=i+1;
    24             exchange(a[i],a[j]);
    25         }
    26     }
    27     exchange(a[i+1],a[right]);
    28     printf("the partion postion is 
    ", i);
    29     return i;
    30 }
    31 
    32 
    33 void quicksort(int *a,int left,int right)
    34 {
    35     if (left<right)
    36     {
    37         int q=partion(a,left,right);
    38         quicksort(a,left,q-1);
    39         quicksort(a,q+1,right);
    40     }
    41 }
    42 
    43 int main()
    44 {
    45     int array[SIZE];
    46 
    47     srand(time(NULL));
    48 
    49     for (int i = 0; i < SIZE; i++)
    50     {
    51         array[i]=rand()/1000+100;
    52     }
    53     printf("before sort:
    ");
    54     for (int j = 0; j < SIZE; j++)
    55     {
    56         printf("%d ",array[j]);
    57     }
    58     printf("
    ");
    59 
    60     quicksort(array,0,SIZE-1);
    61 
    62     printf("after sort:
    ");
    63     for (int k = 0; k < SIZE; k++)
    64     {
    65         printf("%d ",array[k]);
    66     }
    67     printf("
    ");
    68     return 0;
    69 }

    6 堆排序

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <time.h>
     4 
     5 #define SIZE 10
     6 
     7 int left(int i){return i*2;}
     8 
     9 int right(int i){return i*2+1;}
    10 
    11 int parent(int i){return i/2;}
    12 
    13 void swap(int a,int b)
    14 {
    15     int tem=a;
    16     a=b;
    17     b=tem;
    18 }
    19 
    20 void max_heapify(int *a,int i)
    21 {
    22     int length=SIZE;
    23     int l=left(i);
    24     int r=right(i);
    25     int largest;
    26     if (l<=SIZE&&a[l]>a[i])
    27     {
    28         largest=l;
    29     }
    30     else
    31         largest=i;
    32     if (r<=length&&a[r]>a[i])
    33     {
    34         largest=r;
    35     }
    36     if (largest!=i)
    37     {
    38         swap(a[largest],a[i]);
    39         max_heapify(a,largest);
    40     }
    41 }
    42 
    43 void build_max_heap(int *a)
    44 {
    45     int length=SIZE;
    46     for (int i = length/2; i >0; i--)
    47     {
    48         max_heapify(a,i);
    49     }
    50 }
    51 
    52 
    53 void heapsort(int *a)
    54 {
    55     int length=SIZE;
    56     build_max_heap(a);
    57 
    58     for (int i = length; i >=2; i--)
    59     {
    60         printf("%d ", a[0]);
    61         swap(a[0],a[i]);
    62         length=length-1;
    63         max_heapify(a,1);
    64     }
    65 }
    66 
    67 
    68 int main()
    69 {
    70     int array[SIZE];
    71     int length=10;
    72     srand(time(NULL));
    73 
    74     for (int i = 0; i < SIZE; i++)
    75     {
    76         array[i]=rand()/1000+100;
    77     }
    78     printf("before sort:
    ");
    79     for (int j = 0; j < SIZE; j++)
    80     {
    81         printf("%d ",array[j]);
    82     }
    83     printf("
    ");
    84 
    85     heapsort(array);
    86 
    87     printf("after sort:
    ");
    88     for (int k = 0; k < SIZE; k++)
    89     {
    90         printf("%d ",array[k]);
    91     }
    92     printf("
    ");
    93     return 0;
    94 }

     7 归并排序

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <time.h>
      4 
      5 #define SIZE 10
      6 #define big NULL
      7 /*
      8 void merge(int *a,int p,int q,int r)
      9 {
     10     int len1=q-p+1;
     11     int len2=r-q+1;
     12     int len3=len1+1;
     13     int len4=len2+1;
     14     int l[len3]={};
     15     int r[len4]={};
     16     for (int i = 0; i < len1; i++)
     17     {
     18         l[i]=a[p+i-1];
     19     }
     20     for (int j = 0; j < len2; j++)
     21     {
     22         r[j]=a[q+j];
     23     }
     24     int l[len3]=big;
     25     int r[len4]=big;
     26     int i=1;
     27     int j=1;
     28     for (int k = p; k < r; k++)
     29     {
     30         if (l[i]<=r[j]&&l[i]!=big&&r[j]!=big)
     31         {
     32             a[k]=l[i];
     33             i++;
     34         }
     35         else
     36         {
     37             a[k]=r[j];
     38             j++;
     39         }
     40     }
     41 }
     42 */
     43 void merge2(int *a,int p,int q,int r)
     44 {
     45     int len1=q-p+1;
     46     int len2=r-q+1;
     47     int len3=r-p+1;
     48     int left[len1];
     49     int right[len2];
     50     for (int i = 0; i < len1; i++)
     51     {
     52         left[i]=a[p+i-1];
     53     }
     54     for (int j = 0; j < len2; j++)
     55     {
     56         right[j]=a[q+j];
     57     }
     58     while(len1>=0&&len2>=0)
     59     {
     60         a[len3--]=left[len1]>=right[len2] ? left[len1] : right[len2];
     61     }
     62     while(len1>0)
     63     {
     64         a[len3--]=left[len1--];
     65     }
     66     while(len2>0)
     67     {
     68         a[len3--]=right[len2--];
     69     }
     70 
     71 }
     72 
     73 
     74 void mergesort(int *a,int p,int r)
     75 {
     76     if (p<r)
     77     {
     78         int q=(p+r)/2;
     79         mergesort(a,p,q);
     80         mergesort(a,q+1,r);
     81         merge2(a,p,q,r);
     82     }
     83 }
     84 
     85 int main()
     86 {
     87     int array[SIZE];
     88 
     89     srand(time(NULL));
     90 
     91     for (int i = 0; i < SIZE; i++)
     92     {
     93         array[i]=rand()/1000+100;
     94     }
     95     printf("before sort:
    ");
     96     for (int j = 0; j < SIZE; j++)
     97     {
     98         printf("%d ",array[j]);
     99     }
    100     printf("
    ");
    101 
    102     mergesort(array,0,SIZE-1);
    103 
    104     printf("after sort:
    ");
    105     for (int k = 0; k < SIZE; k++)
    106     {
    107         printf("%d ",array[k]);
    108     }
    109     printf("
    ");
    110     return 0;
    111 }
     
  • 相关阅读:
    500 多个 Linux 命令文档搜索
    C++ 字符串基本操作
    串的模式匹配算法
    查看、启动、关闭防火墙
    天润融通面试
    LeetCode 169. 求众数
    【面试题】人人车一次面试总结
    一个完整的 JS 身份证校验代码
    oracle多表查询
    百度地图的Icon
  • 原文地址:https://www.cnblogs.com/tao-alex/p/5873336.html
Copyright © 2020-2023  润新知