zoukankan      html  css  js  c++  java
  • 交换类排序算法

    #include<stdio.h>
    /*
    *交换类排序,每天一道算法题 
    *按照从小到大的顺序进行排序 
    * 毛施平
    */
    //冒泡排序 
    void traverseArray(int *p,int length)
    {
       int i=0;
       for(;i<length;i++)
       {
         printf("%d\n",p[i]);
       } 
    
    }
    //这个是最简单的 
    void bubbleSortOne(int *p,int length)
    {
      int i=length;
      int j,temp;
      int lastChangeIndex;
      printf("简单一点:\n");
      while(i>1)
      {
       lastChangeIndex=1;
        for(j=0;j<i-1;j++)
        {
           if(p[j]>p[j+1])
           {
            temp=p[j];
            p[j]=p[j+1];
            p[j+1]=temp;
            lastChangeIndex=j;
           }
        }
       traverseArray(p,9);
       printf("\n");
       i=lastChangeIndex;
      } 
    } 
    //这个排序并不是最简单的 
    void bubbleSort(int *p,int length)
    {
      int i,j,temp;
      for(i=0;i<length;i++)
      {
        for(j=0;j<length-i-1;j++)
        {
           if(p[j]>p[j+1])
           {
            temp=p[j];
            p[j]=p[j+1];
            p[j+1]=temp;
           }
        } 
      }
    } 
    //快速排序 
    int Partition(int *p,int low,int high)
    {
      //int low=0,high=length-1;
      int temp=p[low];
      while(low<high)
      {
        while(low<high&&p[high]>=temp) high--;
           p[low]=p[high];
        while(low<high&&p[low]<=temp) low++;
           p[high]=p[low]; 
      }
      p[low]=temp;
      return low;
    } 
    void QSort(int *p,int low,int high)
    {
      if(low<high)
      {
       int pivotloc=Partition(p,low,high);
       traverseArray(p,9);
       printf("\n"); 
       QSort(p,low,pivotloc-1);
       QSort(p,pivotloc+1,high);
      }
    
    
    }
    
    int main()
    {
      int a[]={9,2,1,4,5,7,3,8,6}; 
      bubbleSortOne(a,sizeof(a)/sizeof(int));
      int low=0;
      int high=sizeof(a)/sizeof(int)-1; 
     // QSort(a,low,high);
      traverseArray(a,sizeof(a)/sizeof(int));
      
      system("pause");
      return 0;
    }

    冒泡排序和快速排序都属于交换类排序,最简单的冒泡排序需要考虑顺序基本确定以后,如果不需要调整的话,需要设置标志位,避免不进行交换的重复比较。冒泡排序如果正序,只需要比较n-1次,不需要移动,如果逆序的话,需要比较n(n-1)/2次,此时需要移动3n(n-1)/2次。

    快速排序的排序思想是不停地确定中间的值,然后采用递归算法进行分别将两端进行排序。快速排序算法如果序列基本有序的话,快速排序退化成冒泡排序,算法时间复杂度O(n2)。如果不是基本有序的话,算法的时间复杂度为O(nlog(n)),其平均性能最好。递归使用的内存空间栈的大小最坏为O(n),可以通过比较,先快速排序较小的那部分,,则栈的最大深度可降为O(logn)。

  • 相关阅读:
    js数组的迭代
    js检测对象的类型
    java基本数据类型及相互间的转换
    Mybatis Jdbctype JavaType 类型转换器
    Android TableLayout
    android:id设置的三种方式区别在哪?
    android:layout_gravity 和 android:gravity 的区别
    Android LinearLayout
    Log4j 分别使用不同的配置文件
    Extjs GridPanel 中放入 Combox显示问题
  • 原文地址:https://www.cnblogs.com/moshang/p/3948941.html
Copyright © 2011-2022 走看看