简介
冒泡排序(Bubble Sort),是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
步骤
设置数组长度为N,
- 比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换
- 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
- N = N - 1, 如果N不为0就重复前面两步,否则排序完成
冒泡排序第一种方法
void BubbleSort1(int a[], int n){
int i, j;
for(i = 0; i < n; i++){
for(j = 1; j < n - 1; j++){
if(a[j - 1] > a[j]){
Swap(a[j-1], a[j]);
}
}
}
}
下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
冒泡排序第二种方法
void BubbleSort1(int a[], int n){
int j, k;
bool flag;
k = n;
flag = true;
while(flag){
flag = false;
for(j = 1; j < k; j++){
if(a[j-1] > a[j]){
Swap(a[j-1], a[j])
flag=true;
}
k--;
}
}
}
在做进一步的优化,如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必行小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
冒泡排序第三种方法
void BubbleSort3(int a[], int n){
int j, k;
int flag;
flag = n;
while(flag > 0){
k = flag;
flag = 0;
for(j = 1; j < k; j++){
if(a[j - 1] > a[j]){
Swap(a[j - 1], a[j]);
flag = j;
}
}
}
}
冒泡排序毕竟是一个效率低下的排序方法,在数据规模小的是时候,可以利用。数据规模比较大时,最好用其它排序方法。
参考:MoreWindows