数据结构(五)
- 常见的排序算法
- 内部排序
- 交换
- 插入
- 选择
- 归并
- 基数
- 外部排序
- 基于归并的
常见的排序算法
内部排序
交换
冒泡:每一次运行总会将最小的或者最大的放到前面,如果需要交换,一直在交换
快速排序*:经过一次快排的过程,将待排序元素分成两部分:比基准小的,比基准大的,再分别对这两部分进行快
速排序
#include <stdio.h>
//快排操作,将数组分成两部分
int Quick_Pass(int arr[], int low, int high)
{int key = arr[low]; //找基准//从上往下依次比较while(low < high){while(low < high && arr[high] > key){//往前走high--;}//把后面遇到的比key小的值放入到前面arr[low] = arr[high];while(low < high && arr[low] <= key){//往后走low++;}//将前面的比key大的值放入盗后面arr[high] = arr[low];}//比较完了,low == high//基准入队arr[low] = key;return low;
}
//快速排序
void Quick_Sort(int arr[], int low, int high)
{if(low >= high) return ;//执行一次快排操作int mid = Quick_Pass(arr, low, high);//左便Quick_Sort(arr, low, mid-1);//右边Quick_Sort(arr, mid+1, high);
}
int main(int argc, const char *argv[])
{int arr[13] = {55, 22, 34, 12, 99, 76, 38, 65, 29, 35, 11, 36, 74};printf("排序前:");for(int i=0; i<13; i++){printf("%d ", arr[i]);}printf("\n");//排序Quick_Sort(arr, 0, 12);printf("排序后:");for(int i=0; i<13; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
插入
直接插入:重构链表
折半插入:原理同排序二叉树的插入,只是对象是一个有序的顺序表
希尔排序:增量,逐渐减少的,直到增量为1为止
选择
简单选择:每一次运行总会将最小的或者最大的放到前面,如果需要交换,只交换一次
堆(大根堆,小根堆):根结点的值>=左右孩子的值 根节点的值<=左右孩子的值
在Linux下,系统定时器使用小根堆来管理定时器事件。小根堆是一种数据结构,可以快速找到最小值。
归并
当然可以。下面是一个使用C语言编写的简单归并排序算法示例。归并排序是一种分治算法,它的核心思想是将一个
大问题分解成多个小问题,然后递归地解决这些小问题,最后将结果合并起来。
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (int i = 0; i < n1; i++)L[i] = arr[left + i];for (int j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];int i = 0;int j = 0;int k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
}
void merge_sort(int arr[], int left, int right) {if (left >= right)return;int mid = left + (right - left) / 2;merge_sort(arr, left, mid);merge_sort(arr, mid + 1, right);merge(arr, left, mid, right);
}