- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言排序方法(冒泡,选择,插入,归并,快速)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成.
算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数.
针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较.
执行过程:
# include <stdio.h># include <string.h>int main(void){ int arr[] = {5, 2, 3, -8, 34, 76, 32, 43, 0, -70, 35, 543, 6}; int len= sizeof(arr) / sizeof(arr[0]);; int i; //比较的轮数 int j; //每轮比较的次数 int temp; //交换数据时用于存放中间数据 for (i=0; i<len-1; ++i) //比较n-1轮 { for (j=0; j<len-1-i; ++j) //每轮比较n-1-i次, { if (arr[j] < arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } printf("排序后:\n"); for (i=0; i<len; ++i) { printf("%d\x20", arr[i]); } printf("\n"); return 0;}
。
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法.
算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续 寻找最小(大)元素,然后放到已排序序列的末尾.
重复第二步,直到所有元素均排序完毕.
代码:
#include <stdio.h># include <string.h>int main() { int arr[] = { 5, 2, 3, -8, 34, 76, 32, 43, 0, -70, 35, 543, 6}; int len = (int) sizeof(arr) / sizeof(*arr); int i, j, temp; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } for (i = 0; i < len; i++) printf("%d ", arr[i]); return 0;}
。
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 [2] .
算法步骤 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
#include <stdio.h># include <string.h>int main(){ int arr[] = { 5, 2, 3, -8, 34, 76, 32, 43, 0, -70, 35, 543, 6};int len = (int) sizeof(arr) / sizeof(*arr); int i,j,x; for( i= 1; i<len; i++){ if(arr[i] < arr[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。 j= i-1; x = arr[i]; while(j>-1 && x < arr[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间 arr[j+1] = arr[j]; j--; } arr[j+1] = x; //插入到正确位置 }} for(j=0; j<len; j++){ printf("%d ",arr[j]); } printf("\n"); return 0;}
。
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); 。
自下而上的迭代; 。
算法步骤 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; 。
设定两个指针,最初位置分别为两个已经排序序列的起始位置; 。
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置; 。
重复步骤 3 直到某一指针达到序列尾; 。
将另一序列剩下的所有元素直接复制到合并序列尾。 #include <stdio.h> #define MAXSIZE 10 。
// 递归的方式实现归并排序 。
// 实现归并,并把结果存放到list1 。
# include <string.h>#include <stdio.h>void merging(int *list1, int list1_size, int *list2, int list2_size) { int i,j,k, m; int temp[MAXSIZE]; i = j = k = 0; while(i < list1_size && j < list2_size) { if(list1[i] < list2[j]) { temp[k] = list1[i]; k++; i++; } else { temp[k++] = list2[j++]; } } while(i < list1_size) { temp[k++] = list1[i++]; } while(j < list2_size) { temp[k++] = list2[j++]; } for(m = 0;m < (list1_size + list2_size);m++) { list1[m] = temp[m]; } }void MergeSort(int k[], int n) { if(n > 1) { /* *list1是左半部分,list2是右半部分 */ int *list1 = k; int list1_size = n/2; int *list2 = k + list1_size; int list2_size = n - list1_size; MergeSort(list1, list1_size); MergeSort(list2, list2_size); // 把两个合在一起 merging(list1, list1_size, list2, list2_size); }}int main() { int i, arr[] = { 5, 2, 3, -8, 34, 76, 32, 43, 0, -70, 35, 543, 6}; int len = (int) sizeof(arr) / sizeof(*arr); MergeSort(arr, len); printf("排序后的结果是:"); for(i = 0;i < len;i++) { printf("%d", a[i]); } printf("\n\n"); return 0; }
。
原理
快速排序,给基准数据找其正确索引位置的过程. 。
如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾. 。
如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置.
如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值. 。
算法步骤 从数列中挑出一个元素,称为 “基准”(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; 。
#include "stdio.h"typedef struct _Range { int start, end; //开始指向分别指向两端 } Range;Range new_Range(int s, int e) { Range r; r.start = s; //开始指向需要排序数组的两端 r.end = e; return r; //返回一个结构体 }void swap(int *x, int *y) { //交换数据函数 int t = *x; *x = *y; *y = t;}void quick_sort(int arr[], const int len) { if (len <= 0) return; //保证数据长度大于0 Range r[len]; int p = 0; r[p++] = new_Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start >= range.end) continue; int mid = arr[(range.start + range.end) / 2]; // 选取中间点作为基准点 int left = range.start, right = range.end; do { while (arr[left] < mid) ++left; // 检测基准点左侧是否符合要求 while (arr[right] > mid) --right; //检测基准点右侧是否符合要求 if (left <= right) { swap(&arr[left], &arr[right]); left++; right--; // 移又羔以^m } } while (left <= right); if (range.start < right) r[p++] = new_Range(range.start, right); if (range.end > left) r[p++] = new_Range(left, range.end); }}int main(){ int j; int arr[] = { 5, 2, 3, -8, 34, 76, 32, 43, 0, -70, 35, 543, 6}; int len = (int) sizeof(arr) / sizeof(*arr); quick_sort(arr,len); for(j=0; j<len; j++){ printf("%d ",arr[j]); } printf("\n");}
。
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/weixin_44636409/article/details/119611403 。
最后此篇关于C语言排序方法(冒泡,选择,插入,归并,快速)的文章就讲到这里了,如果你想了解更多关于C语言排序方法(冒泡,选择,插入,归并,快速)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何更改循环中变量的名称?比如 number1 、 number2 、 number3 、 number4 ? var array = [2,4,6,8] func ap ( number1: Int
我想设置 View 的背景颜色并在一定延迟后将其更改为另一种颜色。这是我的尝试方式: print("setting color 1") self.view.backgroundColor = UICo
我在使用 express-session 时遇到问题。 session 数据不会在请求之间持续存在。 正如您在下面的代码中看到的那样,/join 路由设置了一些 session 属性,但是当 /sur
我试图从叶渲染器获得一个非常简单的结果,用于快速 Steam 的 for 循环。 我正在上传叶文件 HTML,因为它不接受此处格式正确的代码 - 下面的pizza.swift代码- import
你们中有人有什么好的链接可以与我分享吗?我正在寻找一个 FAST 程序员编辑器,它可以非常快速地打开包含超过 100, 000 行代码的文件?我目前正在使用记事本自动取款机,打开一个 29000 行长
我现在正在处理眼动追踪数据,因此拥有一个巨大的数据集(想想数百万行),因此希望有一种快速的方法来完成此任务。这是它的简化版本。 数据告诉您眼睛在每个时间点正在查看的位置以及我们正在查看的每个文件。 X
我是新手,想为计时器或其他设备选择提示音。 如何打开此列表,以选择其中一种声音? Alert sound list 最佳答案 您将无法在应用中使用系统声音。 但是,您可以包括自己的声音文件,并将其显示
我编写了以下代码来构建具有顺序字符串的数组。 它的工作方式与我预期的一样,但我希望它能更快地运行。有没有更有效的方法在PowerShell中产生我想要的结果? 我是PowerShell的新手,非常感谢
我有一个包含一些非唯一行的矩阵,例如: x 尝试 y <- rle(apply(x, 1, paste, collapse = " ")) # y$lengths is the vector con
我的函数“keyboardWillShown”有问题。所以我想要的是菜单打开时,菜单正好出现在键盘上方。它可以在Iphone 8 plus,8、7、6上完美运行。但是,当我在模拟器上运行Iphone
我正在尝试通过Swift 5中的HTTP get方法从API提取数据。它在启动时成功加载了数据,但是当我刷新页面时,它说“索引超出范围”,这是因为数据是不再会在我的日志中读取,因此索引中没有任何内容。
我想做什么: 从我的数据库中获取时间戳并将其转换为用户的时区。 我的代码: let tryItNow = "\(model.timestampName)" let format = D
给定字体名称和字体大小,如何查找字符串的宽度(CGFloat)? (目标是将UIView的宽度设置为足以容纳字符串的宽度。) 我有两个字符串:一个重复“1”,重复36次,另一个重复“M”,重复36次。
我正在尝试解析此JSON ["Items": ( { AccountBalance = 0; AlphabetType = 3; Description = "\U0631\U
我在UINavigationBar内放置了一个UILabel。 我想根据navigationBar的高度增加该标签的字体大小。当navigationBar很大时,我希望字体大小更大;当滚动并缩小nav
我想将用户输入限制为仅有效数字并使用以下内容: func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, rep
目前我有一个包含超过 100.000 张图像的数据库,它们大小不一或类似,但我想为我的公司制作以下内容: 我插入/上传一张图片,系统返回最有可能相同的图片。我不知道使用什么算法,但它需要快速。我可以预
在我的 swift 项目中,我有一个按钮,我想在标签上打印按下该按钮的时间。 如何解决这个问题? 最佳答案 添加到DHEERAJ的答案中,您只需在func press(sender: UIButton
我必须发表评论,尝试在解析中导入数组。然而,有一个问题。 当我尝试从 Parse 加载数组时,我的输出是 ("Blah","Blah","Blah")这是一个元组...而不是一个数组 TT... 如何
我的应用程序有一个名为 MyDevice 的类,我用它来与硬件通信。该硬件是可选的,实例变量也是可选的: var theDevice:MyDevice = nil 然后,在应用程序中,我必须初始化设备
我是一名优秀的程序员,十分优秀!