冒泡排序 选择排序 插入排序
冒泡排序核心代码:
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]){
long temp = a[in];
a[in] = a[in+1];
a[in+1] = temp;
}
}
}
}
思路:1.比较两个数
2.如果左边的数大,则两个数交换位置
3.内层循环加一,向右移动一个位置,继续比较下面两个数
照着这种比较形式,直到内层循环结束,虽然还没有把所有数都排好序,但是最大的数确实已经到了最右边
外层循环减一,因为已经确定最后一个数是最大的,所以减一,把最后一个数去掉,减少接下来的比较次数 ,如此反复。
时间复杂度:比较次数是n-1+n-2+.....+1 = n(n-1)/2; 约为n^2/2
因为,只有前者比后者大时,才交换顺序,所以交换的次数少于比较的次数。如果数据是随机的,大概有一半数据需要交换,则交换次数为n^2/4
比较和交换的的次数都和n^2成正比,所以为O(n^2)
选择排序核心代码:
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;
}
}
long temp = a[out];
a[out] = a[min];
a[min] = temp;
}
}
思路:外层循环用循环变量out,从数组开头开始向高位增长,内层循环用循环变量in,从out所指位的下一位开始同样是向右移动
在每一个in的新位置,数据项a[in]和a[min]进行比较,如果a[in]更小,则min被赋值in的值。在内层循环的最后,min指向数据最小的数据项,然后交换out和min所指向的数据项
时间复杂度:比较次数和冒泡排序是一样的为n^2/2
交换次数要比冒泡排序少很多。因为N值很大时,比较的次数是主要的,所以和冒泡排序一样,时间复杂度是O(n^2)
插入排序的核心代码:
public void insertSort(){
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;
}
}
思路: 局部有序,更适合用做一组数据排序排的已经差不多了
外层循环从数据的第二个开始,左边数据认定为已经排好的
long temp = a[out]; 将要进行比较的数据出列,腾出移动的位置
内层的while循环是用来比较out+1个数据的左边元素是否比out+1个数据大,如果大的话,将大的数据赋值到腾出来的位置,最后将出队的数据赋值到比它大的数据的位置
时间复杂度:比较次数为n^2/2,然而,因为在每一次排序发现插入点之前,平均只有数据项的一半真的进行了比较,所以比较次数为n^2/4
复制的次数, 大致为比较的次数
在任意情况下,对于随机顺序的数据进行插入排序也需要O(n^2)的时间级