冒泡排序
每次相邻两个元素进行比较, 较大的放后面。每次循环可以得到最大值。
int[] numArray = {5, 7, 5, 3, 8};
for (int i = 0; i < (numArray.length - 1); i++)
{
for (int j = 0; j < (numArray.length - 1 - i); j++)
{
if (numArray[j] > numArray[j + 1])
{
int temp = numArray[j];
numArray[j] = numArray[j + 1];
numArray[j + 1] = temp;
}
}
}
选择排序
每次拿第一个位置和后面所有的元素依次进行比较,如果后面的元素小,就和第一个位置交换位置,每次循环可以得到最小值。
int[] numArray = {5, 7, 5, 3, 8};
for (int i = 0; i < (numArray.length - 1); i++)
{
int changeIndex = i;
for (int j = (i + 1); j < numArray.length; j++)
{
if (numArray[j] < numArray[changeIndex])
{
changeIndex = j;
}
}
if (changeIndex != i)
{
int temp = numArray[i];
numArray[i] = numArray[changeIndex];
numArray[changeIndex] = temp;
}
}
区别
- 两者时间复杂度都为O(n^2), 选择排序每次循环只会发生一次交换,而冒泡在最坏情况每次循环会发生(n - 1)次交换。
- 但是选择排序是不稳定的, 而冒泡排序是稳定的! 比如上述示例,选择排序的第一个5会跟3发生交换,此时原数组中两个5的先后次序已发生改变。而冒泡是两两交换,所以不会发生此问题。