简单排序(冒泡排序,插入排序,选择排序)
这些算法思想是比较简单的,执行速度也相对慢一些,不过,在某些情况下比那些复杂算法实际上还要好一些,比如,对于小规模的文件以及基本有序的文件,插入算法能比快速排序算法更为有效。
如何排序:
1 比较两个数据项
2 交换两个数据想,或者复制其中的一项
冒泡排序:
代码:
package SimpleSort.bubbleSort;public class ArrayBub {private long[] a;private int nElems;public ArrayBub(int max) {a = new long[max];nElems = 0;}public void insert(long value) {a[nElems] = value;nElems++;}public void display() {for (int j = 0; j < nElems; j++) {System.out.print(a[j] + " ");}System.out.println("");}public void bubbleSort() {int out, in;for (out = nElems - 1; out > 1; out--) {for (in = 0; in < out; in++) {if (a[in] > a[in + 1]) {swap(in, in + 1);}}}}public void swap(int dex1, int dex2) {long temp = a[dex1];a[dex1] = a[dex2];a[dex2] = temp;}public static void main(String[] args) {int maxSize = 100;ArrayBub arr = new ArrayBub(maxSize);arr.insert(77);arr.insert(99);arr.insert(44);arr.insert(55);arr.insert(22);arr.insert(88);arr.insert(11);arr.insert(00);arr.insert(68);arr.insert(33);arr.display();arr.bubbleSort();arr.display();}
}
第一层for循环 out计数,从数组的最后开始,每确定一个个最大一个数字out--减少比较项。知道排序到第一个下标为0的。
时间街边O(N2).
交换比较是永远是相邻的数据项。
选择排序:
选择排序改进了冒泡排序,将必要的交换次数congO( N2)减少到O(N),但是比较次数仍保持为O(N2)
代码:
package SimpleSort.selectSort;public class ArraySel {private long[] a;private int nElems;public ArraySel(int max) {a = new long[max];nElems = 0;}public void insert(long value) {a[nElems] = value;nElems++;}public void display() {for (int j = 0; j < nElems; j++) {System.out.print(a[j] + " ");}System.out.println("");}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;}}swap(out, min);}}public void swap(int dex1, int dex2) {long temp = a[dex1];a[dex1] = a[dex2];a[dex2] = temp;}public static void main(String[] args) {int maxSize = 100;ArraySel arr = new ArraySel(maxSize);arr.insert(77);arr.insert(99);arr.insert(44);arr.insert(55);arr.insert(22);arr.insert(88);arr.insert(11);arr.insert(00);arr.insert(68);arr.insert(33);arr.display();arr.selectSort();arr.display();}
}
用一个临时变量min存储最小的那个值,如果碰到比min还夏小的,那么就将那个最小的值赋给min,然后min再进行比较,完成后将最小值放在下标为0的位置上,然后继续比较,out一样是计数,但是在最开始。与冒泡排序相比,减少了移动次数(复制),比较次数还是没有改变。
插入排序
比冒泡(快一倍)和选择排序(快一点)都要快,经常被用在比较复杂的排序算法的最后阶段,例如快速排序
代码:
package SimpleSort.insertSort;import SimpleSort.bubbleSort.ArrayBub;public class ArrayIns {private long[] a;private int nElems;public ArrayIns(int max) {a = new long[max];nElems = 0;}public void insert(long value) {a[nElems] = value;nElems++;}public void display() {for (int j = 0; j < nElems; j++) {System.out.print(a[j] + " ");}System.out.println("");}public void insertionSort() {int out, in;for (out = 1; out < nElems; out++) {long temp = a[out];in = out;while (in > 0 && a[in - 1] >= temp) {a[in] = a[in - 1];--in;}a[in] = temp;}}public static void main(String[] args) {int maxSize = 100;ArrayIns arr = new ArrayIns(maxSize);arr.insert(77);arr.insert(99);arr.insert(44);arr.insert(55);arr.insert(22);arr.insert(88);arr.insert(11);arr.insert(00);arr.insert(68);arr.insert(33);arr.display();arr.insertionSort();arr.display();}
}