1、冒泡排序
2、选择排序
原理
初始有一组8个数字的无序数列
选择排序与冒泡差不多,每一轮直接找到对应位置所需要的值的位置,最后将两个位置上的值进行交换,与冒泡相比省去了每一步都进行交换而只交换最后一次。
-
第一轮选择:
假设位置1上的47为最小数,在2-8中寻找比47小的最小的数,记住它的位置。
位置7上的2是2-8中小于47的最小数。
交换位置1和位置7上的数。第一小的数已经在第一的位置上了。 -
第二轮选择:
假设位置2上的58为剩下数中的最小数,在3-8中寻找比58小的最小的数,记住它的位置。
位置5上的43是3-8中小于58的最小数。
交换位置2和位置5上的数。第二小的数已经在第二的位置上了。 -
第三轮选择:
假设位置3上的87为剩下数中的最小数,在4-8中寻找比87小的最小的数,记住它的位置。
位置7上的47是4-8中小于87的最小数。
交换位置3和位置7上的数。第三小的数已经在第三的位置上了。 -
第四轮选择:
假设位置4上的89为剩下数中的最小数,在5-8中寻找比89小的最小的数,记住它的位置。
位置5上的58是5-8中小于89的最小数。
交换位置4和位置5上的数。第四小的数已经在第四的位置上了。 -
第五轮选择:
假设位置5上的89为剩下数中的最小数,在6-8中寻找比89小的最小的数,记住它的位置。
位置8上的61是5-8中小于89的最小数。
交换位置5和位置8上的数。第五小的数已经在第五的位置上了。 -
第六轮选择:
假设位置6上的68为剩下数中的最小数,在7-8中寻找比68小的最小的数,记住它的位置。
位置7-8没有小于68的数,不进行交换。 -
第七轮选择:
假设位置7上的87为剩下数中的最小数,与位置8上的数进行比较。
位置8上的89大于87,不进行交换。
至此,8个无序的数经过7轮排序成了有序数列,选择相比冒泡就是省略了每次找到小于的数就交换的步骤,变为了找到最小得数直接进行交换,减少了无效的交换次数。
代码实现
//N个数需要N-1轮的排序
for (int i = 0; i < N; i++) {
//将i的当前位置保存下来放到m中
int m = i;
//j从i+1的位置到最后
for (int j = i + 1; j < N; j++) {
//凡是当前m位置上的数大于j位置上的数
if (arr[m] > arr[j]) {
m = j;//m保存最小数的位置
}
}
//如果m的保存的位置和i的位置不一致了,就说明当前i位置上的值不是最小值,则与m位置上存储的最小值进行交换
if (m != i) {
int t = arr[m];
arr[m] = arr[i];
arr[i] = t;
}
}