排序算法---交换排序( java)

来源:互联网 发布:备份软件下载 编辑:程序博客网 时间:2024/06/07 03:08

交换排序中最常用的就是冒泡排序和快速排序,回顾了一些冒泡排序,估计写完这些博客对排序算法算是有了很深的了解了,最后要做一个小总结了,将这些算法的时间复杂度和空间复杂度做一个对比,以后再排序的时候能够对着有比较充分的认识。

1.冒泡排序

 public void bubbleSort(int[] a) {boolean ifBubble = false;for (int i = 0; i < a.length - 1; i++) {    for (int j = 0; j < a.length-1-i; j++) {if(a[j]>a[j+1]){    a[j] = a[j]+a[j+1];    a[j+1] = a[j]-a[j+1];    a[j] = a[j]- a[j+1];    ifBubble = true;}    }    if(!ifBubble){break;    }}    }
对于n个数的排序,我们只需要对其进行n-1次的循环排序就好了,(常识了)说一些冒泡的原理吧,就是通过将数组的前一个元素和后一个元素进行对比,然后将大的放到后面,将小的放到前面,然后再将后面的一个数和其后面的一个数进行对比,如果一个数比较大的话,这一过程将会类似于一个泡从低端向上冒,最终到达顶部,So we call the methond as Bubble Sort;

2.快速排序

算是对冒泡排序的一种改进吧,感觉实现难度要比冒泡难的多,很不容易思考,大体的实现过程是:定义两个数,分别从数组的开始和末位置,从开始位置开始查找大于分界值的数,从最后的位置查找小于分界值的数,当在开始找到小于分界值的数的时候停止向上去寻找,当从末尾查找数值的时候,当找到大于分界值的数的时候停止查找,当i和j不相等的时候,i<j的时候,我们从右边走是找小于该基数的,停止住说明j所停止的位置的数是大于基数的,同理i停止的位置是小于基数的,将两个数进行交换,那么循环可以再次进行,直到两个数的大小相等,注意此处i和j是不可能相等的,当i>j的时候,说明两端的值已经满足了条件了,然后将j的值和基数对调,这样两端的值就保证了一边大于,一边小于。然后将剩余的数进行递归就好了。

顺便说点递归的优缺点,自己找了点资料,好处就是代码写起来不会那么的麻烦和复杂,坏处就是对空间的消耗会比较大,可能会导致堆栈溢出从而导致程序崩溃,为了避免这一情况最好的措施就是通过循环来进行代替。

下面是快速排序的代码实现

public void quickSort (int []a,int start ,int end){       int i = start;       int j = end+1;       if(start < end){   while (true){       while (i< end && a[++i]>=a[start]);       while (j>start&& a[--j]<= a[start]);       if(i<j){   a[i] = a[i] + a[j];   a[j] = a[i] - a[j];   a[i] = a[i] - a[j];       }       else break;   }   a[start] = a[j]+a[start];   a[j] = a[start] - a[j];   a[start] = a[start] - a[j];   quickSort (a,start,j-1);   quickSort (a,j+1,end);       }          }





0 0