1丶选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
我们来看一下代码:
void SelectionSort(int arr[]) {
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
我们来看一个实例:
#include <stdio.h>
#include <string.h>
void SelectionSort(int arr[]) {
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
int main() {
int arr[10] = { 7,6,4,2,1,7,9,6,4,6 };
for (int i = 0; i < 10; i++) {
printf("%d", arr[i]); //打印排序前的数组
}
printf("\n");
SelectionSort(arr);
for(int i = 0; i < 10; i++) {
printf("%d",arr[i]); //打印排序后的数组
}
return 0;
}
我们来看一下运行结果:
打印前是乱序,打印后是有序的,说明我们的算法没问题。
2丶冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个排序之前的文章写过,下面为原文链接:
[冒泡排序](https://blog.csdn.net/weixin_63257947/article/details/123186460)
3丶快速排序
快速排序(Quicksort)是对冒泡排序的改进,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码:
void quickSort(int a[], int left, int right) //start和end都是指下标
{
if (left > right) //如果左边下标比右边大,是不合法的
return;
int base = a[left]; //保存基准数
int i = left;
int j = right;
while (i != j)
{
while (a[j] >= base && i < j) {
j--;
}
while (a[i] <= base && i < j) {
i++;
}
if (j > i) {
int tmp = a[i]; //i和j都停下,交换i和j的元素
a[i] = a[j];
a[j] = tmp;
}
}
a[left] = a[i];
a[i] = base; //把基准数赋值给相遇位置的元素
quickSort(a, left, i - 1); //左边递归进行快速排序
quickSort(a, j+1, right); //右边递归进行快速排序
}
实例:
4丶归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
代码:
void Emergesort(int arr[],int left,int right) {
if (left >= right)
return ;
int mid = (left + right) / 2;
int* temp = (int*)malloc(sizeof(int) * (right - left + 1));
if (temp == NULL)
return;
Emergesort(arr, left, mid); //左边归并
Emergesort(arr, mid + 1, right); //右边归并
int i = left;
int j = mid+1;
int k = 0;
while (i <= mid && j <= right) {
if (arr[i] < arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++]; //有序放入辅助数组
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (i = 0; i <= right - left; i++) {
arr[left+i] = temp[i]; //辅助数组给原数组赋值
}
}
实例:
排序成功