这里介绍三种常用的排序算法:冒泡排序、选择排序、插入排序。
1.冒泡排序
冒泡排序是一种简单的排序,它通过元素的两两比较,不断的将大的或小的元素向左或向右移动,通过这种方式来实现排序。
如下面是实现由小到大的排序:外层循环out一开始为nElems-1,这代表元素的最大位置。内层循环从位置0和位置1的元素开始通过不断比较将较大的值放到较大的位置。当内层循环完毕后,a[nElems-1]就为最大值了。
//.............冒泡排序.............. public void bubbleSort(){ int out; int in; for ( out = nElems-1; out > 1; out--) { //外层循环 for ( in = 0; in < out; in++) { //内层循环 if (a[in]>a[in+1]) { //比较相邻元素的大小 swap(in, in+1); //交换 } } } }
2.选择排序
选择排序是比冒泡复杂一点的排序,它是先选取一个位置,然后和其他位置的值不断比较,如果满足要求(比其他位置大或小),就交换着两个位置的值。
如下同样实现了由小到大的排序方式:选取数组的第out个位置赋值给中间变量min,通过内层循环不断与剩下的数组元素比较,将较小值的位置赋值给min,这样在内层循环完成后位置min代表的数值一定是最小值。然后交换被选择的位置out的值和最小值min位置的值。
//.............选择排序.................. public void selectSort() { int out,in,min; for ( out = 0; out < nElems-1; out++) { //外层循环 min = out; for ( in = out+1; in < nElems; in++) { //内层循环 if (a[in]<a[min]) { min = in; //将较大值得位置in赋值给min } } swap(out, min); //交换位置 } }
3.插入排序
插入排序是最难理解的排序方式,同时也是最多使用的排序方式。原理是由左向右依次选择元素来作为用于插入的值,来通过和左边的数据比较来得到自己的插入位置。这个解释比较麻烦,我怕解释不好,大家直接看代码理解吧。
//...............插入排序.......................... public void insertSort() { int out,in; for ( out = 1; out < nElems; out++) { //外层循环,从第2个位置选取要插入的元素,这样左边的都是已经排好序的数据 long temp = a[out]; in = out; while(in>0&&a[in-1]>=temp){ //从选定值得左侧开始比较 a[in] = a[in-1]; //将所有大于temp(即选定位置out的值)的数据后移 --in; } a[in] = temp; //a【in-1]<temp时,此时的in位置就是要插入的位置 } }