冒泡排序:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端。重复操作,直到排序完成
public void bubbleSort() {
int i, j;
for (i = 0; i < nElems - 1; i++) {
for (j = 0; j < nElems - i - 1; j++) {
if (a[j] > a[j + 1]) {
swap(j, j + 1);
}
}
}
}
选择排序:是从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。
改进了冒泡排序,交换次数(O(n*n)-->O(n)),但比较次数仍为O(n*n)
int out,in,min;
for(out=0;out<size-1;out++){
min=out;
for(in=out+1;in<size;in++){
if(a[in]<a[min]){//not in+1
min=in;
}
}
swap(out,min);
}
不变性:下标<=out的位置的数据项总是有序的
插入排序:比冒泡排序快一倍,比选择排序快一点,更蛮烦;插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序方法分直接插入排序和折半插入排序两种
http://blog.chinaunix.net/uid-28894229-id-4625483.html