1、冒泡排序
冒泡排序: 每次取出相邻的两个元素进行比较,把较大的向后移动
先以一个数组讲解一下,然后再写代码:
待排序数组:3,9,-1,10,20
第一轮排序:
(1)3,9,-1,10,20 ----3跟9比较,不交换
(2)3,-1,9,10,20 ----9比 -1大,所以9跟 -1交换
(3)3,-1,9,10,20 ----9跟10比较,不交换
(4)3,-1,9,10,20 ----10跟20比较,不交换
第一轮过后,将20这个最大的元素固定到了最后的位置
第二轮排序:
因为20的位置已经固定,所以只对前4个进行排序即可:
(1)-1,3,9,10,20 ----3比 -1大,进行交换
(2)-1,3,9,10,20 ----3跟9比较,不交换
(3)-1,3,9,10,20 ----9跟10比较,不交换
第二轮过后,将第二大的元素固定到了倒数第二个位置
第三轮排序:
10和20的位置已经确定,只需对前三个进行排序
(1)-1,3,9,10,20 ----3和-1比较,不交换
(2)-1,3,9,10,20 ----3和9比较,不交换
第三轮过后,将第三大的元素位置确定
第四轮排序:
只对前两个元素进行排序
(1)-1,3,9,10,20 ----3和-1比较,不交换
第四轮过后,将第四大的元素位置确定,此时总共5个元素,已经排序好4个,从而最后一个自然而然就是排好序的了
小结:
设总的元素个数为n,那么由上边的排序过程可以看出:
(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环
(2)每轮排序比较的次数逐轮减少
(3)如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。(详见下边优化部分)
代码实现
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
2、选择排序
选择排序: 假设第一个元素就是最小值(或最大值),用第一个位置上的元素与后面没一个位置上的元素进行比较, 满足条件 交换位置
从待排序的n个数据中,每一趟在n-i+1个元素中选择值最小的元素作为有序序列中的第i个元素,从而达到排序的目的。
简单说就是:第一趟:在n个元素中选择最小的元素与待排序数列的第一个元素交换
第二趟:在第2~n个元素中选择最小的元素与待排序数列的第二个元素交换
第三趟:在第3~n个元素中选择最小的元素与待排序数列的第三个元素交换
……
小结:
1、可以发现n个元素共需要进行n-1趟排序就可完成,因为前n-1个元素确定好位置之后,最后一个自然而然就确定好了位置
2、当选择出了最小的元素之后,若发现其就已经处于将要放置的位置时,则可以不用交换
代码实现
for(int i=0;i<c.length-1;i++){
for(int j=i+1;j<c.length;j++){
if(c[i]>c[j]){
int temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}