冒泡排序 选择排序 插入排序

冒泡排序核心代码:

  public void bubbleSort(){

    int out,in;

    for(out=nElems-1;out>1;out--){

      for(in=0;in<out;in++){

        if(a[in]>a[in+1]){

          long temp = a[in];

            a[in] = a[in+1];

            a[in+1]  = temp; 

      }

    }

  }

}

 

 

思路:1.比较两个数

   2.如果左边的数大,则两个数交换位置

   3.内层循环加一,向右移动一个位置,继续比较下面两个数

照着这种比较形式,直到内层循环结束,虽然还没有把所有数都排好序,但是最大的数确实已经到了最右边

外层循环减一,因为已经确定最后一个数是最大的,所以减一,把最后一个数去掉,减少接下来的比较次数 ,如此反复。

 

 

时间复杂度:比较次数是n-1+n-2+.....+1 = n(n-1)/2;  约为n^2/2

因为,只有前者比后者大时,才交换顺序,所以交换的次数少于比较的次数。如果数据是随机的,大概有一半数据需要交换,则交换次数为n^2/4

比较和交换的的次数都和n^2成正比,所以为O(n^2)

 

选择排序核心代码:

public void selectSort(){

  int out,in,min

  for(out=0;out<nElems-1;out++){

    min=out;

    for(in=out+1;in<nElems;in++){

      if(a[in]<a[min]){

        min= in;

      }

    }

      long temp = a[out];

      a[out] = a[min];

      a[min]  = temp; 

    

  }

}

 

思路:外层循环用循环变量out,从数组开头开始向高位增长,内层循环用循环变量in,从out所指位的下一位开始同样是向右移动

在每一个in的新位置,数据项a[in]和a[min]进行比较,如果a[in]更小,则min被赋值in的值。在内层循环的最后,min指向数据最小的数据项,然后交换out和min所指向的数据项

 

时间复杂度:比较次数和冒泡排序是一样的为n^2/2

交换次数要比冒泡排序少很多。因为N值很大时,比较的次数是主要的,所以和冒泡排序一样,时间复杂度是O(n^2)

 

 

插入排序的核心代码:

public void insertSort(){

  int out,in;
  for(out=1;out<nElems;out++){
    long temp = a[out];
    in = out;
    while(in>0 && a[in-1]>=temp){
      a[in] = a[in-1];
      --in;
    }
      a[in] = temp;
  }

}

 

思路:  局部有序,更适合用做一组数据排序排的已经差不多了

外层循环从数据的第二个开始,左边数据认定为已经排好的

long temp = a[out]; 将要进行比较的数据出列,腾出移动的位置

内层的while循环是用来比较out+1个数据的左边元素是否比out+1个数据大,如果大的话,将大的数据赋值到腾出来的位置,最后将出队的数据赋值到比它大的数据的位置

 

时间复杂度:比较次数为n^2/2,然而,因为在每一次排序发现插入点之前,平均只有数据项的一半真的进行了比较,所以比较次数为n^2/4

复制的次数, 大致为比较的次数

在任意情况下,对于随机顺序的数据进行插入排序也需要O(n^2)的时间级