本文将用C语言的方式介绍冒泡和选择两个排序,希望能够帮助大家。
一、冒泡排序
冒泡排序其实很简单,请看上图,其实就是遍历数组依次进行比较,如果前面的数比后面的大就交换,然后让大的数就像冒泡泡一样冒到后面去,所以看代码吧。
void BubbleSort(int* a, int n)
{
bool Bubble = false;
for (int i = 0; i < n - 1; i++)//整体遍历,如果有10个数据的话其实只需要9趟就可以
{
//单趟遍历,每一趟循环后都会有1个数被排好,排好的数就
//不需要排了,所以j每次都要减i,减1同上
for (int j = 0; i < n -j-1; j++)
{
if (a[j] > a[j + 1])//如果大就交换
{
swap(&a[j], &a[j + 1]);
Bubble = true;
}
}
if (Bubble == false)
{
break;//如果数组是有序的就不会进去比较,直接跳出来
}
}
}
二、选择排序
从一组数中选出最小的然后交换到左边,然后把剩下的看作一组,在选出最小的,依次走下去。但其实可以改良一下,我们同时选出最小的和最大的,这样可以节省一半的时间。
//交换
void swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void SelectSort(int* a, int n)
{
int left = 0;
int right = n - 1;
while (left < right)
{
int maxi = left,mini = left;
for (int i = left+1; i <= right; i++)
{
if (a[i] < a[mini])
{
mini = i;//选出最小的
}
if (a[i] > a[maxi])
{
maxi = i;//选出最大的
}
}
swap(&a[left], &a[mini]);
//必须要加这个判断,因为我们每次取最大的和最小的,left可能会等于maxi,相同的话执行上面
//交换逻辑会将a[maxi]的值该变,在执行下面交换逻辑会出问题
if (left == maxi)
{
maxi = mini;
}
swap(&a[right], &a[maxi]);
//因为最大和最小值都放好了,所以不断往中间缩
left++;
right--;
}
}