标签:
交换排序是指在排序过程中,通过待排序记录序列中元素间关键字的比较,将数据元素进行交换来达到排序目的的方法,主要包括冒泡排序和快速排序。
冒泡排序的基本思想是对所有相邻记录的关键字进行比较,如果a[j]>a[j+1]则将其交换,最终达到有序化。其处理步骤如下:
(1)首先将整个待排序的记录分为有序区和无序区,初始状态有序区为空无序区则为整个待排序的记录。
(2)对无序区从前往后依次将相邻记录的关键字进行比较,若逆序则进行交换,从而使得较大的数据元素右移,这样最终形成有序序列。
通过上面的步骤可以发现,每一次冒泡排序都将无序区中最大的数据元素移到有序区的最右边。并且,对于含n个数据元素的数据序列,最多需要经过n-1趟冒泡排序。
void BubbleSort(int* a,int length) { if (a == NULL || length <= 0) return; int i, j,temp; for (i = length - 1; i > 0; i--){ for (j = 0; j <i; j++){ if (a[j]>a[j + 1]){ temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } //如果一次循环中,没有进行数据交换,那么就说明序列已经有序。 void BetterBubbleSort(int* a, int length){ if (a == NULL || length <= 0) return; int i, j, temp; bool isChanged=false; for (i = length - 1; i > 0; i--){ isChanged = false; for (j = 0; j <i; j++){ if (a[j]>a[j + 1]){ temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; isChanged = true; } } if (isChanged == false) break; } } //更好的冒泡排序,在一次冒泡排序中最后进行交换的位置为j,故我声明了一个last变量记录j,last<=i //然后进行循环时last~i之间的数据元素将为有序,last左边的数据将是无序区。 void BestBubbleSort(int* a, int length){ if (a == NULL || length <= 0) return; int i, j, temp,last=0,m; bool isChanged; last = length - 1; for (i = length - 1; i>0; i--){ isChanged = false; m = last; for (j = 0; j <m; j++) { if (a[j]>a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j+1] = temp; isChanged = true; last = j; } } if (isChanged == false) break; } }
冒泡排序是一种稳定的排序方法,因为只有在大于后一个数的情况下才进行交换。冒泡排序最好情况比较次数为n-1,移动次数仅为0,此时数据元素本身就是有序序列。最坏情况下比较次数为n*(n-1)/2,移动次数为3n(n-1)/2,平均时间复杂度为O(n^2)。
标签:
原文地址:http://www.cnblogs.com/fangyz/p/5818538.html