插入排序、冒泡排序和选择排序详解与Java实现

本文深入探讨了三种经典排序算法:插入排序、冒泡排序和选择排序。详细介绍了每种算法的思想、稳定性和时间复杂度,并通过Java代码实现了插入排序算法,展示了算法的具体应用。此外,还对比了这些算法的特点,帮助读者理解不同场景下选择合适排序方法的重要性。
摘要由CSDN通过智能技术生成

一、插入排序

思想: 插入排序算法是一个对少量元素进行排序的有效算法。插入排序法的排序思想就是从数组的第二个元素开始,将数组中的每一个元素按照规则插入到已排好序的数组中以达到排序的目的.一般情况下将数组的第一个元素作为启始元素,从第二个元素开始依次插入.由于要插入到的数组是已经排好序的,所以只是要从右向左找到比插入点(下面程序中的insertNote)小(对升序而言)的第一个数组元素就插入到其后面.直到将最后一个数组元素插入到数组中,整个排序过程就算完成.

稳定性:稳定的.
时间复杂度:O(n2)

尽管插入排序的复杂度也是 O(n^2),但一般情况下,插入排序会比冒泡排序快一倍,要比选择排序还要快一点。


JAVA实现该算法如下:

Java代码   收藏代码
  1. public void insertSort(int a[]){  
  2.         int length=a.length; //数组长度  
  3.         int j;               //当前值的位置  
  4.         int i;               //指向j前的位置  
  5.         int key;             //当前要进行插入排序的值  
  6.         //从数组的第二个位置开始遍历值  
  7.         for(j=1;j<length;j++){  
  8.             key=a[j];  
  9.             i=j-1;  
  10.             //a[i]比当前值大时,a[i]后移一位,空出i的位置,好让下一次循环的值后移  
  11.             while(i>=0 && a[i]>key){  
  12.                 a[i+1]=a[i]; //将a[i]值后移  
  13.                 i--;         //i前移  
  14.             }//跳出循环(找到要插入的中间位置或已遍历到0下标)  
  15.             a[i+1]=key;    //将当前值插入  
  16.         }  
  17.     }  

    事例图如下:

 

二、冒泡排序

 冒泡排序的过程很简单,就是将第一个记录的关键字和第二个记录的关键字进行比较,如果后面的比前面的小则交换,然后比较第二个和第三个,依次类推。比完一趟,最大的那个已经放到了最后的位置,这样就可以对前面N-1个数再循环比较。

[html]  view plain copy
  1. /*  
  2.  * 冒泡排序  
  3.  */  
  4. public class BubbleSort {  
  5.       
  6.     public void bubble(Integer[] data){  
  7.         for(int i=0;i<data.length;i++){  
  8.             for(int j=0;j<data.length-1-i;j++){  
  9.                 if(data[j]>data[j+1]){   //如果后一个数小于前一个数交换  
  10.                     int tmp=data[j];  
  11.                     data[j]=data[j+1];  
  12.                     data[j+1]=tmp;  
  13.                 }  
  14.             }  
  15.         }  
  16.     }  
  17. }  
三、选择排序

选择排序和冒泡排序差不多,只是冒泡排序在发现比它小的时候就交换,而选择排序是只有在确定了最小的数据之后,才会发生交换。
选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。先临时记录其位置,只有在一趟
循环完以后确定了最小的数据,才会发生交换。

[java]  view plain copy
  1. protected void do_button_actionPerformed(int[] array)){  
  2.     int index;  
  3.     for(int i =1;i<array.length;i++)  
  4.     {  
  5.         index = 0;  
  6.         for(int j = 1;j<=array.length-i;j++)  
  7.         {  
  8.             if(array[j]>array[index]){  
  9.                 index = j;  
  10.             }  
  11.         }  
  12.         int temp = array[array.length - i];  
  13.         array[array.length -i] = array[index];  
  14.         array[index] = temp ;  
  15.     }
  16. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值