为了更方便的实现排序算法,我们将元素交换算法单独写入到方法swap中,如下面代码:
//将c数组中a位置和b位置的元素交换一下
public void swap(int [] c,int a,int b){
int temp = c[a];
c[a] = c[b];
c[b] = temp;
}
冒泡排序
原理
重复的走访要排序的数列,一次比较两个元素,如果他们的顺序错误,就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
代码实现
public void BubbleSort(int a[]){
for (int b = 0;b < a.length;b++){
for (int i = 0;i < a.length-1-b;i++){
if (a[i] > a[i+1]){
swap(a,i,i+1);//将大的交换到后面去
}
}
}
}
选择排序
特点
1、运行时间和输入无关,为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息
2、数据移动是最少的。
原理
首先在未排序的序列中找到最小(最大)元素,放到排序序列中的起始位置,然后,再从剩余未排序的元素中寻找最小(最大)元素,然后放到已排序的序列的末尾。直到所有元素均排序完毕。
代码实现
public void SelectSort(int [] a){
//选择排序,找到数组中最小的那个元素,
// 其次,将它和数组的第一个元素交换位置,
// 再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置,如此反复
int N = a.length;
for (int b = 0; b<N;b++){
int min = b;
for (int i = b+1;i<N;i++){
if (a[min] > a[i]){
min = i;//找到未排序元素中的最小元素
}
}
swap(a,b,min);
}
}
插入排序
特点
与选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序,如果对一个很大的且其中的元素已经有序的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快的多。
原理
将一个元素插入到其它已经有序的数列中的适当位置。为了给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。
代码实现
public void InsertSort(int []a,int lo,int hi){
int B = a.length;
for (int i = lo+1;i < hi+1;i++){
for (int b = i;b > lo;b--){
if (a[b] < a[b-1]){
//将一个数字插入到其它已经有序的数组中的适当位置,前一部分是有序的,后一部分时无序的,从有序的那部分的最后一个元素开始往前比较,依次交换位置
swap(a,b,b-1);
}
}
}
}
算法改进
public void InsertSortImproved(int []a){
int B = a.length;
for (int i =