1.冒泡排序的实现
这里小编使用三次异或来两两交换数值,当然也可以使用三杯水交换,但是总感觉三杯水有很小的几率出现在笔试题中(^_^)个人见解
下面这个两两交换数值的动态图片可以帮助理解
代码实现:
#include <stdio.h>
void mysort(int *s)
{
for (int j = 0; j < 10 - 1; j++) {
for (int i = 0; i < 10 - 1 - j; i++) {
if (s[i] > s[i + 1]) { //这里如果是降序排列的话,就写成<
s[i] = s[i] ^ s[i + 1];
s[i + 1] = s[i] ^ s[i + 1];
s[i] = s[i] ^ s[i + 1];
}
}
}
}
int main(int argc, const char* argv[])
{
int s[10] = { 7, 4, 3, 8, 1, 9, 0, 5, 2, 6 };
mysort(s);
for (int i = 0; i < 10; i++) {
printf("%d ", s[i]);
}
printf("\n");
return 0;
}
2.快速排序的实现
快速排序是冒泡排序的优化,是一种基于交换的排序方式。主要采用了"分而治之"的思想,通过一趟排序,将待排序列分成两部分,其中一部分中的数据都比另一部分中的数据小(每一部分中的数据无需保证有序)。然后将分成的这两部分数据,分别执行排序,每一部分再分成独立的两部分上面的方式递归执行,直到整个序列有序。
这里有一份经典的关于快速排序得到视频供参考:
排序算法舞蹈:快速排序-教育-高清完整正版视频在线观看-优酷
#include <stdio.h>
int mysort(int* s, int low, int high)
{
int flags = s[low]; //选取数组最左侧的数为标志位,也可以选择其他的,这样简单一些
while (low < high) {
while (low < high && flags <= s[high]) { //如果是降序排列,那就改为flags>=s[high]
high--;
}
if (low < high) {
//交换数据
s[low] = s[high];
low++;
}
while (low < high && flags >= s[low]) { //如果是降序排列,那就改为flags<=s[high]
low++;
}
if (low < high) {
s[high] = s[low];
high--;
}
}
s[low] = flags; //这一份数据一定要记得放回原来的数组中
return low;
}
int quick_sort(int* s, int low, int high)
{
if (low < high) {
int ret = mysort(s, low, high);
quick_sort(s, low, ret - 1);
quick_sort(s, ret + 1, high);
}
}
int main(int argc, const char* argv[])
{
int s[10] = { 6, 4, 7, 9, 3, 5, 1, 2, 0, 8 };
for (int i = 0; i < 10; i++) {
printf("%d ", s[i]);
}
printf("\n");
quick_sort(s, 0, 9);
for (int i = 0; i < 10; i++) {
printf("%d ", s[i]);
}
printf("\n");
return 0;
}
关于上述代码的执行过程下面附一份参考流程