排序算法的性能主要受三个方面影响:
1. 时间性能 主要设计两种操作:比较和移动。高效的排序算法应该尽可能少的比较次数和尽可能少的移动次数。
2.辅助空间 即算法的空间复杂度
3.算法的复杂性 指算法本身的复杂性,过于复杂也会影响排序性能。
除此之外,排序算法有时还会考虑其稳定性。这是指排序元素相等时,不改变其先后顺序即为稳定。
排序用到的数组元素交换函数:
//将数组中的i位与j位元素交换
void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
1. 冒泡排序
冒泡排序是一种交换排序,其基本思想为:两两比较相邻记录的关键字,如果反序则交换,每轮能将最值交换到末端,直到没有反序的记录为止。
void bubbleSort(int[] arr){
int i,j;
for(i=0;i<arr.length-1;i++){
for(j=0;j<arr.length-i-1;j++){ //注意这里的判断条件,每轮循环最值到末端
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
如果待排序数组为{2,1,3,4,5,6,7,8,9},第一轮交换后顺序即为最终顺序,第二轮循环会发现没有元素交换,之后的多轮循环将没有必要,因此可以加入标志为flag,用于判断每轮是否发生交换,如果某轮没发生交换,之后的交换将是没有必要的。因此改进的冒泡算法如下:
void bubbleSort2(int[] arr){
int i,j;
boolean flag=true;
for(i=0;flag&&i<arr.length-1;i++){
flag = false;
for(j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
flag = true;
swap(arr,j,j+1);
}
}
}
}
冒泡排序的时间复杂度。最好情况,假设排序的数组本身有序,只进行了n-1次比较,因此其时间复杂度为O(n)。最坏情况时,待排数组完全倒序,此时需要比较1+2+3+...+(n-1)=n(n-1)/2,并作等数量级的记录移动.因此总的时间复杂度为O(n^2).
辅助空间位O(1),排序稳定。
2. 简单选择排序
简单选择排序法是通过n-i次比较,从n-i+1个记录中选出关键字最值的记录,并和第i位进行交换。
void selectSort(int[] arr){
int i,j,temp; //min用于标记最小值的位置
for(i=0;i<arr.length-1;i++){
temp = i;
for(j=i+1;j<arr.length;j++){
if(arr[j]<arr[temp]){
temp = j;
}
}
if(temp != i){
swap(arr,i,temp);
}
}
}