思路:
對一組亂序的數,自下而上兩兩進行比較交換,使較小的數上升,而較大的數下沉。
實現代碼
<pre>
//value為待排序的數組
for(int i=0; i<value.length-1; i++) {
for(int j=value.length-1; j>i; j--) {
if(value[j-1] > value[j]) {
int tmp = value[j-1];
value[j-1] = value[j];
value[j] = tmp;
}
}
}
</pre>
前輩們提出的一些改進
1、設置一標志性變量flag,用于記錄每趟排序中最后一次進行交換的位置。由于flag位置之后的記錄均已交換到位,故在進行下一趟排序時只要掃描到flag位置即可。
改進代碼
<pre>
//value為待排序的數組
int i = value.length - 1;//初始時,最后位置保持不變
while (i > 0) {
int flag = 0;
for (int j = 0; j < i; j++) {
if (value[j] > value[j + 1]) {
flag = j;//記錄交換的位置
int tmp = value[j];
value[j] =value[j + 1];
value[j + 1] = tmp;
}
}
i = flag;//為下一趟排序作準備
}
</pre>
2、傳統冒泡排序中每一趟排序操作只能找到一個最大值或最小值,我們考慮利用在每趟排序中進行正向和反向兩遍冒泡的方法一次可以得到兩個最終值(最大者和最小者) , 從而使排序趟數幾乎減少了一半。
改進代碼
<pre>
//value為待排序的數組
int low = 0;
int high = value.length - 1;
int tmp, j;
while (low < high) {
for (j = low; j < high; ++j) {
if (value[j] > value[j+1]) {
tmp = value[j];
value[j]=value[j+1];
value[j+1]=tmp;
}
}
--high;//修改high值, 前移一位
for (j = high; j > low; --j) {
if (value[j] < value[j-1]) {
tmp = value[j];
value[j] = value[j-1];
value[j-1] = tmp;
}
}
++low; //修改low值,后移一位
}
</pre>
以上就是冒泡排序的基本實現思路和改進,為了更清楚的知道改進后對效率是否有較大的提升,我們進行如下實驗。
隨機生成一萬個無序的含有一萬個隨機零到十萬整數的數列,使用上面三種方法對其進行排序,分別記錄比較次數和交換次數。
未經同意,不得轉載。