通用交换代码:
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
双向冒泡排序:
void bubleSort(int* a, int length) {
int temp, flag; //flag一趟遍历是否有元素交换位置的标致
for (int i = length - 1, begin = 0; i > 0; i--, begin++)//变量i用于控制比较次数
//同时用于控制比较截止时的位置
{
flag = 0;
int j = begin;
for (; j < i; j++)
if (*(a + j + 1) < *(a + j)) {
swap(&a[j], &a[j + 1]);
flag = 1;
}
i--;
for (int z = j; z > begin; z--)
if (*(a + z) < *(a + z - 1))
swap(&a[z], &a[z - 1]);
if (flag == 0) break;
}
}
双向选择排序:
void selectSort(int* a, int length)
{
int begin = 0, end = length - 1, min, max;
while (begin < end)
{
min = max = begin;
for (int i = begin; i <= end; i++)
{
if (*(a + i) > *(a + max)) max = i;
if (*(a + i) < *(a + min)) min = i;
}
swap(&a[end], &a[max]);
if (min == end) min = max;//解决"交叉"问题
swap(&a[begin], &a[min]);
begin++;
end--;
}
}
双向选择排序存在交换元素“交叉”情况。