冒泡排序
冒泡排序重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
- 比较相邻的两个元素,如果第一个比第二大,就交换位置
- 对每一对相邻的元素做同样的工作,从开始一对到最后一对,当一轮比较完之后,最后的元素,一定是最大的(最小的)
- 针对所有的元素,重复执行上面操作,除最后一个元素
- 持续每次需要比较的队伍越来越少,一直到没有任何一对需要比较,终止
需要两层循环,外层循环宏观控制,遍历每一个元素,内层循环控制相邻变量的交换,执行完一次找到最大(小)的元素,并放在合适的位置,最终完成排序。
public static void bubbleSort(int[] a) {
//决定循环次数(每一轮比较作为一次循环)
for (int i = 0; i < a.length-1; i++) {
//决定每次内层循环的次数
//外层循环每执行完一次,都会把最大的元素放在最后面,所以最后一个元素不需要进行比较,因此每次内层循环的次数递减
for (int j = 0; j < a.length-1-i; j++) {
//比较相邻的元素
if (a[j]>a[j+1]) {
//交换位置,使用异或方法进行交换,也可以使用中间变量方法进行交换
a[j+1] = a[j+1]^a[j];
a[j] = a[j+1]^a[j];
a[j+1] = a[j+1]^a[j];
}
}
}
}
选择排序
每次都把最小的/最大的放到最左边。先拿出第一个,假设是最小的,然后挨个和后面的比较,全部比较完之后,如果有比这个元素小的,就换位。
public static void selectSort(int[] a){
int min;
for (int i = 0; i < a.length; i++) {
//每一次循环假设下标为i的元素为最小值
min = i;
//因为i是当前元素,要和后面的比较,就要从i+1开始比较
//这里一定不能写0,否则结果错误
for (int j = i+1; j < a.length; j++) {
//判断min是否为最小值
if (a[min]>a[j]) {
//如果是最小值,则将下标为j赋值给min
min = j;
}
}
if(min != i){
a[i] = a[i]^a[min];
a[min] = a[i]^a[min];
a[i] = a[i]^a[min];
}
}
}