一、冒泡排序
所谓冒泡排序,就是把数组当做一个大水池子。这个水池子里边有许多轻重不一的泡泡,轻的泡泡比较早的浮上来, 比较重的泡泡就会后浮起来。就这样最后水池子的里面,就会出现轻的泡泡在上面重的泡泡在下面的现象。如果把泡泡的重量看成数组的元素大小的话,我们就可以得到一个有序的数组。
那么如何让泡泡浮起来呢?当然是轻的把重的压下去或者用重的把轻的压上去了。下面演示的是让轻的泡泡浮起来的函数。大家想写的话可以在评论区把第2种函数的写法写上去。
void Bsort(int arr[], int x) {
int flag;
for (int i = 0;i < x - 1;i++) {
flag = 0;
for (int j = x - 1;j > i;j--) {
if (arr[j - 1] > arr[j]) {
swap(arr[j - 1], arr[j]);
flag = 1;
}
}
if (flag == 0)
return;
}
}
相信大家也看到了,其中有一个陌生的函数swap()。其实这就是一个普通的交换函数,这个在查找的时候很常用所以被打包起来了,但是大家要记好,如果用C语言的话就要用arr,x,y( X和Y分别表示他在数组的位置)三个参数了,因为C语言传数组只传头指针,所以不可以这样设置接口。
void swap(int &a, int &b) {
int x;
x = a;
a = b;
b = x;
}
二、插入排序
插入排序顾名思义就是把数字挨个插入一个有序的数组里,要做到这一点我们就需要把数组分成两部分,一部分是已经有序的数组,另一部分是待插入的集合。不过新的数字入队每次都要交换位置才能换地方有一点太费事了,那么我们可以设置一个哨兵,去记录一下正在排序的这个数字。然后我们就可以放心的覆盖掉他的值了(多么熟悉的顺序表删除),这样我们就把交换需要的给三个变量赋值简化成了一个变量覆盖另一个变量。而且我们还可以把这个数方便的存储在第1个元素里,这样又能少写一个参数,太棒了。
void Insort(int arr[], int len) {
for (int i = 2;i <= len;i++) {//一共需要处理len-1个元素,arr[10]是第十个元素
if (arr[i] < arr[i-1]){//如果新元素小于哨兵
arr[0] = arr[i];
int t = i-1;//从有序组最大的数开始
while (arr[t] > arr[0]) {
arr[t+1] = arr[t];
--t;
}
arr[t+1] = arr[0];//赋回去
}
}
}
三、快速排序
这种排序方法相比于前面两个要稍微难一些,简单的思路就是创造一个对于任何元素来说左面的总是小于右面的数组。所以需要两步,第1步是把比这个数小的所有数都扔到他的左面,所以他的右边就只剩比他大的数字了。第2部是让他的左面和右面再来一次上述的过程,知道这些左面和右面的小区间长度等于0。用一个递归就可以实现。
int Partition(int* arr, int left, int right) {
int i, k;
for (i = left, k = left;i < right;i++) {
if (arr[right] > arr[i]) {
swap(arr[k], arr[i]);//恒有i<=k,往k后面扔小于right的数
k++;
}
}
swap(arr[k],arr[right]);
return k;
}
void Qsort(int arr[], int left, int right)
{
if (left < right) {
int k = Partition(arr, left, right);
Qsort(arr, left, k - 1);//去左边
Qsort(arr, k + 1, right);//去右边
}
}
(最后再提醒一下下,带有哨兵的数组copy的时候需要注意一点,要给arr+1哦~)