冒泡排序
冒泡排序在排序算法中比较简单,但是可以帮助我们理解不变性。 不变性是指在算法中,某些条件在算法执行时是不变的,始终为真。
/** * 其不变性体现在out右边的数据项始终是有序的, 在整个过程中,该条件始终为真. * 最开始的时候out右边没有数据项. */ public void bubbleSort() { int out, in; for (out = nElements - 1; out >= 1; out--) { //外循环, 从后向前 for (in = 0; in < out; in++) { //内循环, 从前向后 if (array[in] > array[in+1]) { //比较交换, 大的数据项不断后移. long temp = array[in]; array[in] = array[in+1]; array[in+1] = temp; } } } }
选择排序
选择排序与冒泡排序一样,进行N*(N-1)/2次比较,即O(N的平方)。
/** * 其不变性体现在下标小于等于out数据项始终是有序的, 在整个过程中,该条件始终为真. */ public void selectionSort() { int out, in, min; long temp; for (out = 0; out < nElements; out++) { min = out; //起始位置,最小值. for (in = out + 1; in < nElements; in++) { //注意in从out+1的位置开始 if (array[min] > array[in]) { //如果还有更小的值 min = in; //设定新的最小值的下标 } } temp = array[out]; //存放每轮循环最左边的值 array[out] = array[min]; //最左边的值和新的最小值交换位置 array[min] = temp;//最左边的值和新的最小值交换位置 } }
插入排序
/** * 其不变性体现在下标小于out数据项是局部有序的,虽然有序,但是最终位置并未确定,因为会有位置变动的情况, 在整个过程中,该条件始终为真. */ public void insertionSort() { int out, in; for (out = 1; out < nElements; out++) { //out变量作为标记,从1开始. long temp = array[out]; //标记的数据项出列 in = out; while (in > 0 && array[in-1] > temp) { //while循环每一次都向右移动了一个已排序的数据项. array[in] = array[in-1];//大的数据项右移 --in; //in变量继续左移, 直到不满足条件而无法左移 } array[in] = temp; //在in的位置插入标记的数据项 } }