排序算法的分类如下:
1.插入排序(直接插入排序、折半插入排序、希尔排序);
2.交换排序(冒泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序);
4.归并排序;
5.基数排序。
这里讲简单排序(冒泡排序、选择排序、插入排序)
冒泡排序:
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。
性能方面:比较次数O(n^2),n^2/2;
交换次数O(n^2),n^2/4
public static void swap(int one ,int two){
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
public static void bubbleSort(long [] a){
int out , in;
for (out = a.length-1; out>1 ; out--){ // 这重循环是比较的轮数
//比较的次数
for (in = 0; in < out; in++ ){
if (a[in]>a[in+1])
swap(in, in+1);
}
}
}
选择排序:
在未排序的数中,选中一个数(currn)作为标记,与下一个数 (next) 作为比较,如果 next 小于 currn,则取消该数的标记,把标记赋于 next ,再用这个next 去比较另一个数,如此反复直到所有的数比完,标记出最小的那个数再把这最小的数最第一个数进行交换
性能方面:比较次数O(n^2),n^2/2 交换次数O(n),n
/**
* 选择排序
* @param a
*/
public static void selectSort(long []a){
int out ,in ,min;
for (out = 0; out<a.length -1; out++){
min = out;
for (in = out+1 ;in<a.length ;in++){
if (a[min] > a[in]){
min = in;
}
}
swap(out, min);
}
}
插入排序:
将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表
性能:复制次数O(n),n^2/4 比较次数是前两者的一般
/**
* 插入排序
* @param a
*/
public static void insertSort(long [] a){
int length = a.length;
int out , in ;
for (out = 1; out < length ; out++){
long temp = a[out]; //后面排序的第一个数
in = out;
while (in > 0 && a[in -1] >= temp){
a[in] = a[in-1]; //in 这项数据后右移动
in -- ;
}
a[in] = temp;
}
}
三者排序之间的比较:
选择排序与冒泡排序:
交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CUP时间多,所以选择排序比冒泡排序快。
* 但是N比较大时,比较所需的CPU时间占主要地位,所以这时的性能和冒泡排序差不太多,但毫无疑问肯定要快些。
插入排序:复制所需的CPU时间较交换少,所以性能上比冒泡排序提高一倍多,而比选择排序也要快。