本文首发于我的个人博客:　尾尾部落　排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基本的排序算法,并且经常要求现场手写基本的排序算法。如果这些问题回答不好,估计面试就凉凉了。所以熟练掌握排序算法思想及其特点并能够熟练地手写代码至关重要。　下面介绍几种常见的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序的思想,其代码均采用Java实现。　1.　冒泡排序　冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。　算法描述　比较相邻的元素。如果第一个比第二个大,就交换它们两个;　对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;　针对所有的元素重复以上的步骤,除了最后一个;　重复步骤1~3,直到排序完成。　动图演示　算法实现　public　static　void　bubbleSort　(　int　[]　arr　)　{　int　temp　=　0　;　for　(　int　i　=　arr　.　length　-　1　;　i　>　0　;　i　每次需要排序的长度　for　(　int　j　=　0　;　j　　arr　[　j　+　1　])　{　temp　=　arr　[　j　];　arr　[　j　]　=　arr　[　j　+　1　];　arr　[　j　+　1　]　=　temp　;　}　}　//loop　j　}　//loop　i　}//　method　bubbleSort　稳定性　在相邻元素相等时,它们并不会交换位置,所以,冒泡排序是稳定排序。　适用场景　冒泡排序思路简单,代码也简单,特别适合小数据的排序。但是,由于算法复杂度较高,在数据量大的时候不适合使用。　代码优化　在数据完全有序的时候展现出最优时间复杂度,为O(n)。其他情况下,几乎总是O(　n2　)。因此,算法在数据基本有序的情况下,性能最好。　要使算法在最佳情况下有O(n)复杂度,需要做一些改进,增加一个　swap　的标志,当前一轮没有进行交换时,说