#include<iostream>
using namespace std;
//交換兩個數,這裏用到了引用
void Swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
return ;
}
void BubbleSort1(int a[], int len)
{
int i,j;
for (i =0 ; i < len; i++)
{
for(j = 1; j < len - i; j++) // 這層的循環,注意 len - i
{
if (a[j-1] > a[j])
{
Swap(a[ j-1], a[j]);
}
}
}
return ;
}
/* 優化這個版本
* 設置一個標誌flag, 如果這一趟(某一輪循環)發生了交換,設置爲true;如果有一趟(一輪)沒有發生交換
* 說明排序已經排好,設置爲false
*/
void BubbleSort2(int a[], int len)
{
int i, j, k;
bool flag;
k = len; //控制外層循環
flag = true; //初始時,需要排序
while(flag)
{
flag = false; //設置flag 不需要排序,如果循環裏面把flag置成true了,說明需要操作
for (j =1 ; j < k; j++)
{
if (a[j - 1] > a[j])
{
Swap(a[ j-1], a[j]); //交換數值
flag = true; //需要排序操作
}
}
k--;
}
return ;
}
/*如果有10個數的數組,僅前面5個數無序,後面5個已經排序好了且都大於前面的5個數
* 在第一趟遍歷之後,後面發生的交換的位置必定小於5,且這個位置之後的數據必定已經排好序了
*記錄下這個位置,第二次只要從數組頭部遍歷到這個位置就行
*/
void BubbleSort3(int a[], int len)
{
int i, j, k;
int flag;
flag = len; //控制外層循環
while(flag >0)
{
k = flag ;
flag = 0;
for (j =1 ; j < k; j++) //第一輪循環結束了之後,知道flag後面的數已經拍好了
{
if (a[j - 1] > a[j])
{
Swap(a[ j-1], a[j]); //交換數值
flag = j; //需要排序操作
}
}
}
return ;
}
int main()
{
int i;
int N =10; //數組個數
int s[10] = {72,6,57,88,60,42,83,73,48,85}; //初始化
//int s[10] = {48,6,57,60,42,72,73,83,85,88}; //初始化
for(i = 0; i < 9; i++)
cout<< s[i] <<" ";
cout<<endl;
//quick_sort(s, 0, 10-1); //快速排序
//BubbleSort1(s,N);
//BubbleSort2(s,N);
BubbleSort3(s,N);
//輸出排序後的數組
for(i = 0; i < 9; i++)
cout<< s[i] <<" ";
return 0;
}
白話經典算法系列之一 冒泡排序的三種實現(轉)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.