各种排序总结(一)之--—冒泡排序、选择排序、快速排序

  各种排序总结——冒泡排序、选择排序、快速排序

 

     1、冒泡排序是比较经典的排序方法,是一种用时间换空间的排序方法。我总结了一下它的特点:(1)它的时间复杂度是;(2)每一趟相邻元素两两比较完毕就会产生最值(最大值);(3)每次比较完后下一趟就会少一个元素参与比较(即该趟比较的最大值)。

 

下面就是简单的排序原理图(以下排序都是按照从小到大):


实现代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package lianxi_01;  
  2.   
  3. public class Bubble{    
  4.     public static void main(String[] args){    
  5.         int score[] = { 2469805713 };    
  6.         for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序    
  7.             for(int j = 0 ;j < score.length - i - 1; j++){    //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)    
  8.                 if(score[j] < score[j + 1]){    //把小的值交换到后面    
  9.                     int temp = score[j];    
  10.                     score[j] = score[j + 1];    
  11.                     score[j + 1] = temp;    
  12.                 }    
  13.             }                
  14.             System.out.print("第" + (i + 1) + "次排序结果:");    
  15.             for(int a = 0; a < score.length; a++){    
  16.                 System.out.print(score[a] + "\t");    
  17.             }    
  18.             System.out.println("");    
  19.         }    
  20.             System.out.print("最终排序结果:");    
  21.             for(int a = 0; a < score.length; a++){    
  22.                 System.out.print(score[a] + "\t");    
  23.        }    
  24.     }    
  25. }    

 

      2、选择排序相比冒泡排序不稳定,时间复杂度也是。选择排序没趟都会产生最小值,它不是相邻元素的比较而是在该元素设置一个索引i。然后与数组的其他元素依次比较(除了上一个索引值),直到找到小于该元素(索引j)时交换两元素,接着继续从i索引(此时已经不是原来的数值)值与索引j+1值比较。重复上述比较过程……简单的原理图如下:

 

实现代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package lianxi_01;  
  2.   
  3.   
  4. /* 
  5.  * 选择排序 
  6.  */  
  7. public class XuanzeDemo {  
  8.     public static void main(String[] args) {  
  9.          int score[] = { 2469805713 };   
  10.           
  11.         for (int x = 0; x < score.length - 1; x++) {  
  12.             for (int y = x + 1; y < score.length; y++) {  
  13.                 if (score[y] < score[x]) {  
  14.                     int temp = score[x];  
  15.                     score[x] = score[y];  
  16.                     score[y] = temp;  
  17.                 }  
  18.             }  
  19.         }  
  20.           
  21.          System.out.print("最终排序结果:");    
  22.          for(int a = 0; a < score.length; a++){    
  23.              System.out.print(score[a] + "\t");    
  24.     }    
  25.     }  
  26. }  


     3、快速排序

 一趟快速排序的算法是:   

   1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;   

   2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];   

   3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--), 找到第一个小于key的值A[j],A[i]与A[j]交换;   

   4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++), 找到第一个大于key的A[i],A[i]与A[j]交换;   

   5)重复第3、4、5步,直到I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。 找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束)

    这里的过程原理图比较复杂没有画出,下面是一个循环体的分析图:

                                                         

代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package lianxi_01;  
  2.   
  3. import java.util.Arrays;  
  4.   
  5. /* 
  6.  * 快速排序 
  7.  */  
  8. public class QuickSortDemo {  
  9.     public static void main(String[] args) {  
  10.         //定义数组  
  11.          int data[] = { 2469805713 };    
  12.           
  13.         quickSort(data, 0, data.length - 1);  
  14.   
  15.         System.out.println("排序后:" +Arrays.toString(data));  
  16.     }  
  17.      private static void quickSort(int[] data, int i, int j) {  
  18.             int pivotIndex = (i + j) / 2;  
  19.             // swap  
  20.             swap(data, pivotIndex, j);  
  21.   
  22.             int k = partition(data, i - 1, j, data[j]);  
  23.             swap(data, k, j);  
  24.             if ((k - i) > 1)  
  25.                 quickSort(data, i, k - 1);  
  26.             if ((j - k) > 1)  
  27.                 quickSort(data, k + 1, j);  
  28.   
  29.         }  
  30.     private static int partition(int[] data, int l, int r, int pivot) {  
  31.         do {  
  32.             while (data[++l] < pivot);  
  33.             while ((r != 0) && data[--r] > pivot);  
  34.             swap(data, l, r);  
  35.         } while (l < r);  
  36.         swap(data, l, r);  
  37.         return l;  
  38.     }  
  39.       
  40.     public static void swap(int[] data, int i, int j) {  
  41.         int temp = data[i];  
  42.         data[i] = data[j];  
  43.         data[j] = temp;  
  44.     }  
  45. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值