1、冒泡排序:
(1)
public void sortIntegers(int[] A) {
// write your code here
//冒泡 大的往后放
int len = A.length;
for(int i=0;i<len-1;i++)
for(int j=0;j<len-i-1;j++){
if(A[j] > A[j+1]){
int tmp = A[j];
A[j] = A[j+1];
A[j+1] = tmp;
}
}
}
Note:第二个for循环中是len-i-1。
或者
(2)
public void sortIntegers(int[] A) {
// write your code here
//冒泡 小的往前放
int len = A.length;
for(int i=0;i<len-1;i++)
//i最小为0,j>0即j最小为1,j-1不会越界
for(int j=len-1;j>i;j--){
if(A[j] < A[j-1]){
int tmp = A[j];
A[j] = A[j-1];
A[j-1] = tmp;
}
}
}
若i = len - 1的时候,j > i 也就是j > len - 1,而j的初值是len-1,因此肯定不会成立,所以第一个for循环还是i < len - 1,即i取不取len-1都无所谓。同理,上面的那个也是!以后还是常用后面这一种,减少数组越界的问题。
(3)稍微优化一下:
public void sortIntegers(int[] A) {
// write your code here
//冒泡
int len = A.length;
boolean flag;
for(int i=0;i<len;i++){
flag = true;
for(int j=len-1;j>i;j--){
if(A[j] < A[j-1]){
int tmp = A[j];
A[j] = A[j-1];
A[j-1] = tmp;
flag = false;
}
}
if(flag)//没有交换
break;
}
}
(4)选择排序
public void sortIntegers(int[] A) {
// write your code here
//选择
int len = A.length;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++)//j的初值,i和i+1其实都对。
if(A[i] > A[j]){
int tmp = A[j];
A[j] = A[i];
A[i] = tmp;
}
}
}
选择最小的放到第1个位置,第二小的放在第二个位置。
外层循环其实只要进行n-1次就可以了,因为n-1个最小位置确定了,那么所有的n个也都确定了。在这里我用的是A[i]的值进行比较,其实记录下标值也是可以的,两种方法实现的目的是一样的。
(5)插入排序
public void sortIntegers(int[] A) {
// write your code here
//插入
int len = A.length;
for(int i=1;i<len;i++){//从第一个和第零个开始比较
if(A[i] < A[i-1]){
for(int j=i;j>0;j--){
if(A[j] < A[j-1]){
int tmp = A[j];
A[j] = A[j-1];
A[j-1] = tmp;
}
}
}
}
}
假设第一个元素是默认排好序的。前面是已经排好序的部分。后面的这个元素从最后一个开始比较,如果比前面这个数小,交换继续和更前面的数比较;如果比前面的数大了,就不再交换,结束了。
Note:插入是从第二个数开始的,假设第一个是排好序的。
这是真正的第一次全面的写这三个排序,之前都是知道思路,或者看看代码,没把基本的排序放在心上。