插入排序:
| 直接插入排序: |
| void InsertSort(ElemType A[], int n) |
| { |
| int i, j; |
| for (int i = 2; i <= n; i++) |
| if (A[i] < A[i - 1]) |
| { |
| A[0] = A[i]; |
| for (j = i - 1; A[0] < A[j]; j--) |
| A[j + 1] = A[j]; |
| A[j + 1] = A[0]; |
| } |
| } |
| |
| 折半插入排序: |
| void InsertSort(ElemType A[], int n) |
| { |
| int i, j, low, high, mid; |
| for (int i = 2; i <= n; i++) |
| A[0] = A[i]; |
| low = 1; |
| high = i - 1; |
| while (low <= high) |
| { |
| mid = (low + high) / 2; |
| if (A[mid] > A[0]) |
| high = mid - 1; |
| else |
| low = mid + 1; |
| } |
| for (j = i - 1; j >= high + 1; j--) |
| A[j + 1] = A[j]; |
| A[high + 1] = A[0]; |
| } |
| |
| 希尔排序: |
| void ShellSort(ElemType A[], int n) |
| { |
| int dk, i, j; |
| for (dk = n / 2; dk >= 1; dk = dk / 2) |
| for (int i = dk + 1; i <= n; i++) |
| if (A[i] < A[i - dk]) |
| { |
| A[0] = A[i]; |
| for (j = i - dk; j > 0 && A[0] < A[j]; j -= dk) |
| A[j + dk] = A[j]; |
| A[j + dk] = A[0]; |
| } |
| } |
| |
交换排序:
| 冒泡排序: |
| void sort(ElemType arr[],int n){ |
| |
| for (int i = 0; i < n-1; ++i) { |
| int flag=1; |
| |
| for (int j = 0; j < n-1-i; ++j) { |
| |
| |
| if(arr[j]>arr[j+1]){ |
| int tem=arr[j]; |
| arr[j]=arr[j+1]; |
| arr[j+1]=tem; |
| |
| flag=0; |
| } |
| } |
| if(flag==1){ |
| break; |
| } |
| } |
| } |
| |
| 快速排序: |
| |
| int Partition(ElemType A[], int low, int high) |
| { |
| ElemType pivot = A[low]; |
| while (low < high) |
| { |
| while (low < high && A[high] >= pivot) |
| --high; |
| A[low] = A[high]; |
| while (low < high && A[low] <= pivot) |
| ++low; |
| A[high] = A[low]; |
| } |
| A[low] = pivot; |
| return low; |
| } |
| |
| void QuickSort(ElemType A[],int low,int high){ |
| if(low<high){ |
| int pivot_pos=Partition(A,low,high); |
| QuickSort(A,low,pivot_pos-1); |
| QuickSort(A,pivot_pos+1,high); |
| } |
| } |
选择排序:
| 简单选择排序: |
| void SelectSort(ElemType A[], int n) |
| { |
| for (int i = 0; i < n - 1; i++) |
| { |
| int min = i; |
| for (int j = i + 1; j < n; j++) |
| if (A[j] < A[min]) |
| min = j; |
| if (min != i) |
| swap(A[i], A[min]); |
| } |
| } |
| |
| 堆排序(大根堆): |
| |
| void BuildMaxHeap(ElemType A[], int len) |
| { |
| for (int i = len / 2; i > 0; i--) |
| HeadAdjust(A, i, len); |
| } |
| |
| void HeadAdjust(ElemType A[], int k, int len) |
| { |
| A[0] = A[k]; |
| for (int i = 2 * k; i <= len; i *= 2) |
| { |
| if (i < len && A[i] < A[i + 1]) |
| i++; |
| if (A[0] >= A[i]) |
| break; |
| else |
| { |
| A[k] = A[i]; |
| k = i; |
| } |
| } |
| A[k] = A[0]; |
| } |
| void HeapSort(ElemType A[], int len) |
| { |
| BuildMaxHeap(A, len); |
| for (int i = len; i > 1; i--) |
| { |
| swap(A[i], A[1]); |
| HeadAdjust(A, 1, i - 1); |
| } |
| } |
| |
归并排序:
| 归并排序: |
| void Merge(ElemType A[], int low, int mid, int high) |
| { |
| int i, j, k; |
| for (k = low; k <= high; k++) |
| B[k] = A[k]; |
| for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) |
| { |
| if (B[i] <= B[j]) |
| A[k] = B[i++]; |
| else |
| A[k] = B[j++]; |
| } |
| while (i <= mid) |
| A[k++] = B[i++]; |
| while (i <= high) |
| A[k++] = B[j++]; |
| } |
| void MergeSort(ElemType A[], int low, int high) |
| { |
| if (low < high) |
| int mid = (low + high) / 2; |
| MergeSort(A, low, mid); |
| MergeSort(A, mid + 1, high); |
| Merge(A, low, mid, high); |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?