冒泡排序是一种很经典的排序方式了,当然他也是最简单的一种交换式排序,冒泡排序的思想很简单,从前面开始,每每两个数相比,如果前面的大于后面的则交换位置,知道最后一个数,这样一轮排序下来,最大的数就跑到了最后面,如此往复,知道全部有序。
当然上面是最简单的冒泡排序,他显然有一个很大的缺点,就是做了很多的重复劳动,当我们开始排序的时候,实际上整个数列就可以分成有序区和无序区,而根据冒泡排序的特性,有序区里面已经排好序的数是不用的动的,而根据上面的那种算法,每次一轮排序的时候都是遍历整个数列,包括有序区,这就十分浪费时间了。所以优化的方式时,每次一轮排序完,都标记一下这个数的位置,即设定一个有序区的标志位,这样下次排序的时候只需要遍历无序区里面的数了。
下面是具体的代码:
//冒泡排序
public static int[] BubbleSort(int r[],int n){
int exchang=n;//有序区标记位,一开始默认是标记在最后一位
while (exchang!=0) {//还未全部有序时
int bound=exchang;//将标记位赋给bound
exchang=0;
//一轮冒泡排序
for (int i = 0; i <bound; i++) {//遍历无序区
if (r[i]>r[i+1]) {//如果前面比后面打,则交换
int buffer=r[i];
r[i]=r[i+1];
r[i+1]=buffer;
exchang=i;//更新有序区标记位
}
}
}
return r;
}
冒泡排序是一种稳定的排序方式,他的时间复杂度为O(n²)。
同样属于交换排序的快速排序是对冒泡排序的一种改进,冒泡排序每次比较都说是相邻两个数,也就意味着每一次交换都只移动了一个位置,这就造成了总的比较次数和移动次数比较多,而快速排序则改进了这一缺点,挑一个数为轴,每次挑和他距离最远的数与他相比,然后交换,这样小的可以快速被交换到左边,大的快速被交换到右边,大大减少了比较次数和移动交换次数。
快速排序的思想是:选择最左边的数为轴,先选择最右边的数与他比较,如果他大于最右边的数,则交换位置,此时最左边的数被交换到最右边,然后他再找离他最远的数比较,如果比他大,则交换位置,这样一轮快速排序下来,比这个轴值大的都跑到他右边去了,比这个轴值小的都跑到他左边去了,然后再分别递归他左边和右边进行快速排序,直到整个数列有序。
快速排序是种不稳定的排序。