1.什么是冒泡排序?java
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。走访数列的工做是重复地进行直到没有再须要交换,也就是说该数列已经排序完成。
这个算法的名字由来是由于越大的元素会经由交换慢慢“浮”到数列的顶端,故名。算法
2.算法的原理是什么? (从后往前)code
a.比较两个相邻元素的大小,若是第二个比第一个大,则交换它们.
b.从第一对元素比较到最后一对,最后元素会是最小元素.
c.对全部元素重复上述步骤,除了最后一个.排序
如:[6 2 4 1 5 9]
3.简单java实现ast
public void sort(int[] arr) { int temp = 0; for (int i=arr.length-1; i>0; --i) { for (int j=0; j<i; j++) { // 比较相邻元素 if (arr[j+1] > arr[j]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }
4.如何改进算法呢?
例如: [5 6 4 3 2 1]这组数据,通过一趟排序后为[6 5 4 3 2 1],以后的循环再从第二个元素继续比较每组相邻元素并无意义,即不执行if语句内代码,能够从这里改善算法.增长一个布尔变量用于判断是否排序完成,完成则不须要执行if语句内代码.class
改进一以下:计算机科学
public void sort2(int[] arr) { int temp = 0; boolean swaped; for (int i=arr.length-1; i>0; --i) { swaped = false; for (int j=0; j<i; j++) { // 比较相邻元素 if (arr[j+1] > arr[j]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; swaped = true; } } if (!swaped) { break; } } }
5.该算法还能改进吗?
例如: [6 7 5 8 4 3 2 1]这组数据
通过一趟排序后为[7 6 8 5 4 3 2 1]最后一组比较元素为 2 和 1;
通过第二趟排序后为[7 8 6 5 4 3 2 1]最后一组比较元素为3 和 2;
通过第三趟排序后为[8 7 6 5 4 3 2 1]最后一组比较元素为4 和 3;
观察可知:
在第一趟排序后 5 4 3 2 1已排好序,因此下趟排序只须要到6便可便可,即最后一组比较元素为6和8便可.
结合改进一判断交换标志位
改进二以下:变量
public void sort3(int[] arr) { int temp = 0; int lastSwap = arr.length - 1; int lastSwapTemp = lastSwap; for (int i=arr.length-1; i>0; --i) { lastSwap = lastSwapTemp; for (int j=0; j<lastSwap; ++j) { if (arr[j+1] > arr[j]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; lastSwapTemp = j; } } if (lastSwapTemp == lastSwap) { break; } } }
6.算法复杂度原理
7.算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素日后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。因此,若是两个元素相等,我想你是不会再无聊地把他们俩交换一下的;若是两个相等的元素没有相邻,那么即便经过前面的两两交换把两个相邻起来,这时候也不会交换,因此相同元素的先后顺序并无改变,因此冒泡排序是一种稳定排序算法。循环
8.鸡尾酒排序(冒泡排序改进版)
鸡尾酒排序也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也能够视做选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此演算法与冒泡排序的不一样处在于排序时是以双向在序列中进行排序。
java实现:
public static void coktailSort(int[] arr) { int left = 0; int right = arr.length-1; while (left < right) { //将最小元素放到后面 for (int i=left; i<right; i++) { if (arr[i+1] > arr[i]) { swapElement(arr, i, i+1); } } right--; //将最大元素放到前面 for (int i=right; i>left; i--) { if (arr[i-1] < arr[i]) { swapElement(arr, i-1, i); } } left++; } } private static void swapElement(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }