zoukankan      html  css  js  c++  java
  • 算法之排序

    一:冒泡排序

     1 void M_sort(long a[], long n)
     2 {
     3     long i,j,flat = 0;
     4     //第一种写法
     5     /*
     6     for (i = 0; i < n - 1; i++)
     7     {
     8         for (j = 0; j < n - 1 - i; j++)
     9         {
    10             if (a[j] > a[j + 1])
    11                 flat = 1;//改进版
    12                 swap(a,j,j+1);
    13             }
    14         }
    15         if(flat == 0) break;
    16     }
    17     */
    18     //第二种写法
    19     for(i = n -1 ; i>0; i--)
    20     {
    21         for(j = 0;j < i ;j++)
    22         {
    23            
    24             if(a[j]>a[j+1])
    25             {
    26                  flat = 1;
    27                 swap(a,j,j+1);
    28             }
    29         }
    30     if(flat == 0 ) break;
    31     }
    32 }
    View Code

    二:插入排序

     1 void X_sort(long a[],long n)
     2 {
     3     long x,y;
     4     /*
     5     for(i = 1;i<n;i++)
     6     {
     7        long temp = a[i];  //摸下一张牌
     8         for(j = i;j>0 && a[j-1]>temp;j--)
     9         {
    10           
    11             a[j] = a[j-1]; 移动空位
    12         }
    13         a[j] = temp; 插入新位置
    14     }*/
    15     for(x = 1;x<n;x++)
    16     {
    17         for(y = x - 1 ; y >= 0 && a[y]>a[y+1];y--)
    18         {
    19             swap(a,y,y+1);
    20         }
    21     }
    22 }
    View Code

    三:堆排序

     1 void swap(long A[], int i, int j)
     2 {
     3     long temp = A[i];
     4     A[i] = A[j];
     5     A[j] = temp;
     6 } 
     7 void PrecDown(long A[],int i , int N)
     8 {
     9     int child,parent;
    10     int tmp = A[i];
    11     for(parent = i;2 * parent + 1 < N;parent = child)
    12     {
    13         child = 2 * parent + 1;
    14         if(child!=N-1 && A[child] < A[child + 1 ])
    15         {
    16             child++;
    17         }
    18         if(A[child]<=tmp)
    19         {
    20              break;    
    21         }else
    22         {
    23             A[parent] = A[child];
    24         }
    25     }
    26     A[parent] = tmp;   
    27 }
    28 void Heap_sort(long a[],int N) 
    29 {
    30     int i ; 
    31     for( i  = N/2;i>=0;i--)
    32     {
    33         PrecDown(a,i,N); 
    34     }
    35     for(i = N-1;i>0;i--)
    36     {
    37         swap(a,0,i);
    38         PrecDown(a,0,i);
    39     }
    40 }
    View Code

    四:归并排序

     1 void Merge(long A[],long tmpA[],int L,int R,int RightEnd){
     2     // L = 左边元素开始位置 ,R = 右边元素开始位置 ,RightEnd = 右边结束终点位置
     3     int NumSize = RightEnd-L+1; // 元素个数
     4     int LeftEnd = R-1;  // 左边元素终点位置
     5     int tmp = L;  // tmp 数组开始位置
     6     while( L <= LeftEnd && R <= RightEnd ){
     7         if(A[L] <= A[R]) // 从小到大排序,选小的
     8             tmpA[tmp++] = A[L++];
     9         else
    10             tmpA[tmp++] = A[R++];
    11     }
    12     // 也许左没走完
    13     while( L <= LeftEnd )
    14         tmpA[tmp++] = A[L++];
    15     // 也许右边没走完
    16     while( R <= RightEnd)
    17         tmpA[tmp++] = A[R++];
    18     // 再导回 A ,tmp此时已经越界,所以要先减再用
    19     for(int i=0;i<NumSize;i++)
    20         A[RightEnd--] = tmpA[--tmp];
    21 }
    22 
    23 // 分治
    24 void Msort(long A[],long tmpA[],int L,int RightEnd){
    25     if(L < RightEnd){
    26         int center = ( L + RightEnd )/2;
    27         Msort(A,tmpA,L,center);
    28         Msort(A,tmpA,center+1,RightEnd);
    29         Merge(A,tmpA,L,center+1,RightEnd);
    30     }
    31 }
    32 
    33 void Merge_sort(long A[],int N){
    34     long tmpA[N];
    35     Msort(A,tmpA,0,N-1);
    36 }
    View Code

    五:选择排序

     1 void X_sort(long a[],long n)
     2 {
     3     //选择排序: 就是拿一个数字,比较还有没有比这个数小的,如果有,就交换一下数字
     4     long i , j ;
     5     for( i = 0; i < n;i++)
     6     {
     7         long targer = i;
     8         for(j = i +1;j<n;j++)
     9         {
    10             targer = a[targer]>a[j]?j:targer;
    11         }
    12         swap(a,i,targer);
    13     }
    14 
    15     
    16 }
    View Code

    六:快速排序

     1 void quick_sort(int a[], int L, int R)
     2 {
     3     if(L >= R)
     4     {
     5         return;
     6     }
     7     int x = L,y = R;
     8     int key = a[x];
     9     while(x < y)
    10     {
    11         while(x < y && a[y]>=key)
    12         {
    13             y--;
    14         }
    15         a[x]= a[y];
    16         while(x < y && a[x] <= key)
    17         {
    18             x++;
    19         }
    20         a[y] = a[x];
    21     }
    22     a[x] = key;
    23     quick_sort(a,L,x-1);
    24     quick_sort(a,y+1,R);
    25 }
    View Code
  • 相关阅读:
    Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比
    2018数学建模国赛B题
    目标检测综述整理
    numpy实现两层layer
    应用安全
    应用安全
    应用安全
    应用安全
    应用安全
    应用安全
  • 原文地址:https://www.cnblogs.com/Yzengxin/p/14058167.html
Copyright © 2011-2022 走看看