插入,选择,归并,快速排序
插入排序:
插入排序在最坏情况和平均情况下时间复杂度是Θ(n2)
#include <stdio.h> #define LEN 5int a[LEN] = {10, 5, 2, 4, 7};void print(void) {for (int i = 0; i < LEN; i++)printf(" %d", a[i]);printf("\n"); }void insertion_sort(void) //该算法要求背诵 {int j, key;for (int i = 1; i < LEN; i++){print();key = a[i];for (j = i - 1; j >= 0 && a[j] > key; j--)a[j + 1] = a[j];a[j + 1] = key;}print(); }int main(void) {insertion_sort();return 0; }
选择排序:
#include <stdio.h> #define LEN 5int a[LEN] = {10, 5, 2, 4, 7};void print(void) {for (int i = 0; i < LEN; i++)printf(" %d", a[i]);printf("\n"); }void selection_sort(void) //该算法要求背诵 {int min, low;for (int i = 0; i < LEN - 1; i++){print();min = a[i];low = i;for (int j = i + 1; j < LEN; j++){if (a[j] < min){min = a[j];low = j;}}a[low] = a[i];a[i] = min;}print(); }int main(void) {selection_sort();return 0; }
归并排序:
1 #include <stdio.h> 2 #define LEN 8 3 int a[LEN] = {5, 2, 4, 7, 1, 3, 2, 6}; 4 5 void merge(int start, int mid, int end) 6 { 7 int n1 = mid - start + 1; // mid - start + 1 8 int n2 = end - mid; // end - (mid+1) + 1 9 int left[n1], right[n2]; 10 11 //分别将a数组的左半部分和右半部分,拷贝到left和right数组 12 for (int i = 0; i < n1; i++) /* left holds a[start..mid] */ 13 left[i] = a[start + i]; 14 for (int j = 0; j < n2; j++) /* right holds a[mid+1..end] */ 15 right[j] = a[mid + 1 + j]; 16 17 //归并操作,将排序完毕的left和right中较小的切片拷贝到a数组 18 int i = 0, j = 0, k = start; 19 while (i < n1 && j < n2) 20 { 21 if (left[i] < right[j]) 22 { 23 a[k] = left[i]; 24 k++, i++; //这两条语句等价于a[k++] = left[i++]; 25 } 26 else 27 { 28 a[k] = right[j]; 29 k++, j++; //这两条语句等价于a[k++] = right[j++]; 30 } 31 } 32 33 //经过上一步的归并,将left或者right中剩余的部分拷贝至a数组 34 while (i < n1) /* left[] is not exhausted */ 35 a[k++] = left[i++]; /* 循环体的展开形式同上 */ 36 while (j < n2) /* right[] is not exhausted */ 37 a[k++] = right[j++]; 38 } 39 40 void print(void) 41 { 42 for (int i = 0; i < LEN; i++) 43 printf(" %d", a[i]); 44 printf("\n"); 45 } 46 47 void sort(int start, int end) 48 { 49 int mid; 50 if (start < end) 51 { 52 mid = (start + end) / 2; 53 printf("sort (%d-%d, %d-%d)", start, mid, mid + 1, end); 54 print(); 55 56 sort(start, mid); 57 sort(mid + 1, end); 58 merge(start, mid, end); 59 60 printf("merge (%d-%d, %d-%d)", start, mid, mid + 1, end); 61 print(); 62 } 63 } 64 65 int main(int argc, char const *argv[]) 66 { 67 sort(0, LEN - 1); 68 return 0; 69 }
快速排序:
1 #include <stdio.h> 2 #define LENGTH 8 3 4 int a[LENGTH] = {5, 2, 4, 7, 1, 3, 8, 6}; 5 6 int partition(int, int); 7 void quicksort(int, int); 8 9 void quicksort(int start, int end) 10 { 11 12 if (start < end) 13 { 14 int mid = partition(start, end); 15 quicksort(start, mid - 1); 16 quicksort(mid + 1, end); 17 } 18 } 19 20 int partition(int start, int end) 21 { 22 int pivot = a[end]; 23 24 while (start < end) 25 { 26 while (start < end && a[start] <= pivot) 27 start++; 28 a[end] = a[start]; 29 30 while (start < end && a[end] >= pivot) 31 end--; 32 a[start] = a[end]; 33 } 34 35 a[start] = pivot; 36 return start; 37 } 38 39 int main(int argc, char const *argv[]) 40 { 41 for (int i = 0; i < LENGTH; i++) 42 printf(" %d", a[i]); 43 printf("\n"); 44 45 quicksort(0, LENGTH - 1); 46 47 for (int i = 0; i < LENGTH; i++) 48 printf(" %d", a[i]); 49 printf("\n"); 50 51 return 0; 52 }
转载于:https://www.cnblogs.com/echo1937/p/10134311.html
插入,选择,归并,快速排序相关推荐
- C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序: 直接插入排序 希尔排序 (插入) 冒泡排序 快速排序 (交换) 直接选择排序 ...
- 1035. 插入与归并(25)
1035. 插入与归并(25)根据维基百科的定义:插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元 ...
- C++学习之路 | PTA乙级—— 1035 插入与归并 (25 分)(精简)
1035 插入与归并 (25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直 ...
- PAT乙级(1035 插入与归并)
PAT乙级 1035 插入与归并 解题思路 代码 详细题目见官网 大意:给定序列,第一行为原始序列,第二行为某种排序产生的中间序列 输出结果: 第一行,输出是 插入排序 还是 归并排序 第二行,给出该 ...
- 【2020模拟考试T5】【PAT乙】1035 插入与归并 (25分) 两种排序的sort写法
problem 1035 插入与归并 (25分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位 ...
- PAT 乙级 1035 插入与归并
1035 插入与归并 (25 point(s)) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位 ...
- 1035 插入与归并(C++)
题目详情 1035 插入与归并 (25分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如 ...
- 【题解】【AcWing】1579. 插入还是归并
1579. 插入还是归并 原题传送:AcWing 1579. 插入还是归并 根据维基百科: 插入排序迭代,每次将一个插入元素插入到排好序的输出序列中,每次迭代插入排序都会从输入数据中移除一个元素,并在 ...
- JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)
1. 冒泡 // 冒泡 - 每次循环, 将两两中偏大的元素移动到右边 for (let i = 0; i < arr.length - 1; i++) {for (let j = i; j &l ...
- Python数据结构04-冒泡、选择、插入、归并、希尔、快速排序、二分查找
Python数据结构 各种排序实现 常见排序算法效率比较 搜索 二分法查找 各种排序实现 排序思想不做描述. #冒泡 def bubble_sort(alist):for x in range(0,l ...
最新文章
- Log4Net配置使用简记
- python控制摄像头拍照_python+opencv+pyqt5控制摄像头在Qlabel上显示
- 几个非常有用的iOS学习博客链接
- Leetcode - 142. Linked List Cycle II
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
- 【王道考研计算机网络】—速率相关的性能指标
- windows设置开机启动项
- 有没有五金产品展开计算机软件,拆单软件功能介绍
- SwitchNAT 测试
- SecureCRT 中文(附上1.解决SecureCRT乱码问题2.解决Hostname lookup failed: host not found问题)
- eclipse不自动弹出提示的解决办法(eclipse alt+/快捷键失效)centos 6.7
- R语言 dbWriteTable 写入数据库为空和乱码问题
- Jupyter Notebook中使用conda配置的Python虚拟环境
- 乌卡时代下,企业供应链管理体系的应对策略
- 未知usb设备(设备描述请求失败)_HomePod mini?电源线同样不可拆卸:但或能用USB-C移动电源供电...
- 搭载敏捷飞天底座 阿里云专有云敏捷版全面升级
- html一条竖线写法
- 重新做计算机老师的说说,说说我们电脑班老师 ── 刁元清
- c语言 投影法图像定位,基于抛物线拟合和边缘点搜索的虹膜精确定位
- PostgreSQL回滚TRUNCATE操作的原理
热门文章
- android 自定义span_教你自定义android中span
- mongodb 3.4 安装_Python数据分析及可视化实例之CentOS7.2+MongoDB V3.4 安装
- Visio studio 2019中opencv 4.1.1运行环境配置(亲测可用)
- 概率机器人总结——占用栅格地图先实践再推导
- 机器视觉 · 立体相机
- 全球及中国皮裤行业消费需求及未来产销前景预测报告2022-2027年
- 中国氨纶市场“十四五”规划及未来动态分析报告2021年版
- 【转载】一个男人关心的东西 决定了他的层次
- 福大软工1816:项目测评
- 探秘小程序(9):父页面与自定义组件交互