• 排序算法


    数据结构_排序总结-MarchOn

    稳定性:

    注:相等元素不交换

    稳定:冒泡、插入、归并、基数

    不稳定:选择、快速、堆、希尔

    实现:

    希尔排序:

     1 void shellSort(int v[],int n)
     2 {
     3     int gap,i,j,tmp;
     4     for(gap=n/2;gap>0;gap/=2)
     5     {
     6         for(i=gap;i<n;i++)
     7         {
     8             for(j=i-gap;j>=0 && v[j]>v[j+gap];j-=gap)
     9             {
    10                 tmp=v[j];
    11                 v[j]=v[j+gap];
    12                 v[j+gap]=tmp;
    13             }
    14         }
    15     }
    16  } 

     快速排序:

    (这里提供四个实现,前两个实现以首元素为枢纽元,后两个实现可以指定枢纽元的位置,前两个实现可以看做是后两个实现的特例)

      1 void swap(int *a,int *b)
      2 {
      3     int tmp=*a;
      4     *a=*b;
      5     *b=tmp;
      6 }
      7 void quickSort1(int a[],int s,int e)//第一个元素作为枢纽元 
      8 {
      9     if(s>=e) return;
     10     int i=s+1;
     11     int j=e;
     12     while(1)
     13     {
     14         //若用do while循环,则  初始i=s;j=t+1;   do{i++;}while(!(a[i]>=a[s] || i==t));   do{j--;}while(!(a[j]<=a[s] || j==s));
     15         while(i<e && a[i]<a[s]) //或i<=e也可 
     16         {
     17             i++;
     18         }
     19         while(j>s && a[j]>a[s])//或j>=s也可 
     20         {
     21             j--;
     22         }
     23         
     24         if(i<j)
     25         {
     26             swap(&a[i],&a[j]);
     27         }
     28         else
     29         {
     30             break;
     31         }
     32     }
     33     swap(&a[s],&a[j]);
     34     quickSort1(a,s,j-1);
     35     quickSort1(a,j+1,e);
     36 }
     37 void quickSort2(int a[],int s,int e)//第一个元素作为枢纽元 
     38 {
     39     if(s>=e) return;
     40     int i=s;
     41     int j=s;
     42     while(++i <= e)
     43     {
     44         if(a[i]<a[s])
     45         {
     46             swap(&a[i],&a[++j]);
     47         }
     48     }
     49     swap(&a[s],&a[j]);
     50     quickSort2(a,s,j-1);
     51     quickSort2(a,j+1,e);
     52 }
     53 void quickSort3(int a[],int s,int e)//可以指定枢纽元 
     54 {
     55     if(s>=e) return;
     56     
     57     int pivot=(s+e)/2;//指定枢纽元
     58     
     59     int i=s;
     60     int j=e;
     61     while(1)
     62     {
     63         //若用do while循环,则  初始i=s-1;j=t+1;   do{i++;}while(!(a[i]>=a[pivot] || i==t));   do{j--;}while(!(a[j]<=a[pivot] || j==s));
     64         while(i<e && a[i]<a[pivot]) //或i<=e也可 
     65         {
     66             i++;
     67         }
     68         while(j>s && a[j]>a[pivot])//或j>=s也可 
     69         {
     70             j--;
     71         }
     72         
     73         if(i<j)
     74         {
     75             swap(&a[i],&a[j]);
     76             if(i==pivot) pivot=j;
     77             else if(j==pivot) pivot=i;
     78         }
     79         else
     80         {
     81             break;
     82         }
     83     }
     84     swap(&a[pivot],&a[i]);
     85     quickSort3(a,s,j-1);
     86     quickSort3(a,j+1,e);
     87 }
     88 
     89 void quickSort4(int a[],int s,int e)//可以指定枢纽元 
     90 {
     91     if(s>=e) return;
     92     
     93     int pivot=(s+e)/2;//指定枢纽元 
     94     
     95     int i=s-1;
     96     int j=s-1;
     97     while(++i <= e)
     98     {
     99         if(a[i]<a[pivot])
    100         {
    101             swap(&a[i],&a[++j]);
    102             if(pivot==j) pivot=i;
    103         }
    104     }
    105     swap(&a[pivot],&a[++j]);
    106     quickSort2(a,s,j-1);
    107     quickSort2(a,j+1,e);
    108 }
    View Code
  • 相关阅读:
    html pre 元素
    获取不重复随机数
    CSS查找匹配原理和简洁高效
    排序
    javascript 去数组重复项
    asp.net页面生命周期
    经典 Javascript 正则表达式
    深入理解JavaScript定时机制
    排序简介
    理解 JavaScript 闭包
  • 原文地址:https://www.cnblogs.com/z-sm/p/4156526.html
Copyright © 2020-2023  润新知