根据给定文件的信息,本文将详细介绍C语言中的几种常用排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及希尔排序。 ### 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,也就是说该数列已经排序完成。 **代码示例:** ```cpp void bubble_sort(int a[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++) if (a[i] > a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } print(a, n); } ``` ### 二、选择排序(Selection Sort) 选择排序是一种简单直观的排序算法。它的基本思想是从待排序的数据元素中选出最小或最大元素,存放在序列的起始位置,然后再从剩余未排序元素中继续寻找最小或最大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 **代码示例:** ```cpp void select_sort(int a[], int n) { int i, j, k, temp; for (i = 0; i < n - 1; i++) { k = i; for (j = i + 1; j < n; j++) if (a[k] > a[j]) k = j; // k 指向最小元素 if (i != k) { // 如果 k 不等于 i,则交换 a[i] 和最小值 temp = a[k]; a[k] = a[i]; a[i] = temp; } } cout << "选"; print(a, n); } ``` ### 三、插入排序(Insertion Sort) 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列的部分有序状况下,可以提高其效率。 **代码示例:** ```cpp void insert_sort(int a[], int n) { int i, j, temp; for (i = 1; i < n; i++) { // 从第二个元素开始 temp = a[i]; // temp 存储当前元素 j = i - 1; while (j >= 0 && temp < a[j]) { a[j + 1] = a[j]; j--; } a[j + 1] = temp; } cout << "插"; print(a, n); } ``` ### 四、快速排序(Quick Sort) 快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。步骤如下: 1. 从数列中挑出一个元素,称为“基准”。 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割操作。 3. 递归地将小于基准值元素的子数列和大于基准值元素的子数列排序。 **代码示例:** ```cpp void quick_sort(int a[], int i, int j) { int m, n, temp, k; m = i, n = j; k = a[(i + j) / 2]; do { while (a[m] < k && m < j) m++; // 寻找比基准大的元素 while (a[n] > k && n > i) n--; // 寻找比基准小的元素 if (m <= n) { // 两元素相遇 temp = a[m]; a[m] = a[n]; a[n] = temp; m++; n--; } } while (m <= n); if (m < j) quick_sort(a, m, j); // 排序右侧数组 if (n > i) quick_sort(a, i, n); // 排序左侧数组 } ``` ### 五、希尔排序(Shell Sort) 希尔排序是基于插入排序的一种更高效的改进版本。它与普通插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序是不稳定排序算法。 **算法步骤:** 1. 选择一个增量序列 t1, t2, ..., tk, 其中 ti > tj, tk = 1; 2. 按增量序列个数 k,对序列进行 k 趟排序; 3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 **代码示例:** ```cpp void shell_sort(int a[], int n) { int i, j, k, temp; k = n / 2; // 增量 while (k >= 1) { for (i = k; i < n; i++) { temp = a[i]; j = i - k; while (j >= 0 && temp < a[j]) { a[j + k] = a[j]; j = j - k; } a[j + k] = temp; } k /= 2; } cout << "希尔"; print(a, n); } ``` 以上就是几种常用的排序算法及其C语言实现方式。这些算法各有优缺点,在实际应用中应根据具体情况选择合适的算法。
#include<string.h>
using namespace std;
int a[20][20];
void fun(int n)
{
int maxRow=n,maxCol=n;
int val=0;
int ivalue=1;
#include <stdio.h>
#include <iostream>
using namespace std;
//C语言几大排序算法
void print(int a[],int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void bubble_sort(int a[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
- 粉丝: 0
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Spring Boot + Vue 3.2 + Vite 4.3开发的前后端分离博客项目源代码.zip
- Go语言基础知识到高级应用全面解析
- 毕业设计前后端分离博客项目源代码.zip
- E008 库洛米(3页).zip
- 前端拿到的列表数据里id都一样的处理办法.txt
- 批量导出多项目核心目录工具
- 课程设计前后端分离博客项目源代码.zip
- C#语言教程:面向对象与高级编程技术全面指南
- PHP语言详细教程:从基础到实战
- 电影管理系统,数据库系统概论大作业
- Web开发中JavaScript编程语言的全面解析
- ajax发请求示例.txt
- 企业数据管理系统项目源代码.zip
- 计算机技术-JAVA语言介绍-基本语法(上)
- 基于西门子 PLC 的晶圆研磨机自动控制系统设计与实现-论文
- 家庭理财系统源代码+答辩PPT+论文.zip