最近在准备面试和笔试,所以系统的复习下排序算法,本想着将排序算法一起写到一篇博客的,后来发现排序算法太多了,不写文字就写程序也会有很大的篇幅。因此决定分开写,本文介绍冒泡排序和快排两种算法。本文基于数据结构(c语言版--严蔚敏)的教材写的,程序用java实现。书中的文字还是有点字面语,我用大白话讲解。好,开始。(本文都是给一个无序的数组排序,设数组为a)本文代码本人亲测!!!
博客三部曲:1、文字描述 2、图片深入 3、程序辅助
1、起泡排序
比较数组中的前两个值,如果第一个数大于第二个数,则这两个数构成了一个逆序对(a[1] > a[2]),交换这两个数。然后比较第二个数和第三个数。以此类推,直到第n-1个数和第n个数比较为止。上面说的这个过程为一次冒泡排序,注意:是一次,并不是冒泡排序就完事了。这一过程之后会发现,数组中的最大的元素已经到了数组最后的位置。当然,也可以反着来,从后往前来,就是第n个数小于第n-1个数,则交换,如果这样的话,经过一次排序后最小的值会到数组的第一个元素的位置。然后进行第二趟起泡排序,对前n-1个数进行同样的操作。如下图:
气泡排序:java代码
public static void bubble(int[] a ){
for(int i = 0; i < a.length; i ++)
for(int j = 0; j < i; j++)
if(a[j] > a[i]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
2、快速排序(快排)
为什么快排和气泡排序放在一起呢?因为快排是对起泡排序的一种改进。基本思想:通过一趟排序将待排序的记录(数)分割成独立的两部分,其中一部分记录的数比另一部分记录的数小,然后在对这两部分记录继续进行上述过程。看到这里是不是在想,递归实现,本文即用递归实现快速排序。
快排过程:首先在要排序的序列 a 中选取一个中轴值(通常选数组的第一个值),而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。
快排和起泡排序很像,这两种排序都是先将一个值找到它最终的位置。气泡排序找到的最终位置是最大的元素(或者最小的元素)所在的位置,也就是数组最后的位置。而快排是找到了中间的一个数的最终位置。
上图:
快速排序(快排)java程序:(递归实现)
public static void q_Sort(int[] a, int low, int high){
if(low < high){
int p = Partition(a, low, high);
q_Sort(a, low, p - 1);
q_Sort(a, p + 1,high);
}
}
public static int Partition(int a[], int low, int high){
int p = a[low];
while(low < high){
while(low < high && a[high] >= p) --high;
a[low] = a[high];
while(low < high && a[low] <= p) ++low;
a[high] = a[low];
}
a[low] = p;
return low;
}