-
2022-01-14 23:08:19
int main() { int a[3];//定义一个长度为3的数组 for (int i = 0;i < 3;i++) { scanf_s("%d", &a[i]); }//输入数组 for (int j = 1;j <3;j++) { if (a[j]> a[j-1]) { int z = a[j]; a[j] = a[j-1]; a[j-1] = z; } } for (int i = 0;i < 3;i++) { printf("%d ", a[i]); }//输出数组 return 0; }
更多相关内容 -
C语言实现数组排序并分组奇偶数
2021-11-30 22:17:57输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。 首先拿到这道题目,我们先可以很顺利的写出主函数的内容,然后再重点讨论这个...今天遇到一个问题,值得探讨一下,问题如下:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
首先拿到这道题目,我们先可以很顺利的写出主函数的内容,然后再重点讨论这个用来调整数组的函数,程序如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void print(int arr[], int sz) { int i = 0; for(i = 0; i < sz; i++) { printf("%d", arr[i]); } printf("\n"); } void move(int arr[], int sz) { } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int sz = sizeof(arr) / sizeof(arr[0]); print(arr, sz); move(arr, sz); print(arr, sz); return 0; }
这里我们选择先给上一个打印函数,再执行move函数之前,我们先把数组打印出来,以便于等一会与move函数执行调整过后的数组进行对比,现在来着重思考一下这个move函数是怎么实现的。
如果我们用普通的思路,一个个找数组中的奇数,偶数,然后再复制数组,如下图:
这样一来,最起码程序中会出现3次for循环,虽然直观,但是有更好的方法,结合图来讲:
我们可以发现,每当我们找到一个奇数,奇数按照题目来说是要放在前半部分的,所以可以这样子想,指针从左往右找的时候,比如1是奇数,然后继续往后找,找到2的时候,2是偶数,依题意要放在后面,那么现在先停下来,从右往左找,0是偶数,往前找找到9,9是奇数,依题意9也要在前半部分,那么此时也停下来,然后将刚才前面在2停下的位置与这次9停下的位置两者交换一下,以此类推,左边指针再往后找,右边指针往前找。
直到找到上图中这种情况,左指针L,右指针R,原本L是小于R的,中间有元素需要我们挪动,但现在如果像上图中的情况,那么证明所有元素已经完成交换了,完成题目的要求了,所以这种解题方法更有效率。
现在来写代码,用指针来写左右指针就是:
那么现在就把以下三步思路写成程序即可:
(1)从左向右找一个偶数
(2)从右向左找一个奇数
(3)奇数和偶数的交换
void move(int arr[], int sz) { int* left = arr; int* right = arr + sz - 1; //从右向左找一个偶数,停下来 while(left < right) { while((*left) % 2 == 1) { left++; } //从右向左找一个奇数,停下来 while((*right) % 2 == 0) { right--; } //奇数和偶数交换 int tmp = *left; *left = *right; *right = tmp; } }
写到这里,大家可能就觉得已经很完美了,但是并不是的,依然存在问题,我们运行程序来看一看就知道了:
这里不难发现,6和5的位置不对,问题就是因为刚才程序一上来就用tmp交换奇数和偶数,大家想象一下,如果 left 和 right 走到下图这种情况的时候:
如果此时不加任何判断条件的话,left 和 right 依然执行交换,那么就会出现刚才程序执行过后出现的问题了,所以我们要加一个判断条件,当 left 和 right 交错的时候就不要再进行交换了,改良后这段程序应该变成下图:
此时程序再次运行:
大家看起来可能没什么问题,认为已经完成了,其实并不是的,这种写法依然存在问题,大家想象一下,如果这个数组里面的数全部都是奇数的话,left 指针从左向右找偶数,会导致越界访问的情况,如果放的全是偶数的话,right 指针也会产生越界访问的情况,所以这里指针往后找一定会有一个参数范围,找的前提条件依然要是 left < right,指针才会从前往后找偶数,或者从后往前找奇数,这部分加上对应的条件后,代码再次改良变成下图如此:
程序再次运行:
这才是最终最完美的结果,所以写代码要把所有情况都考虑周到,不然就算在这个vs编译的过去,在其他编译器也不一定能跑的过去,因为考虑不周到的话,有些用例会无法通过程序,就好像刚才讨论到的全是奇数或者全是偶数的情况,因此写程序要更细心!
最后附上完整代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void print(int arr[], int sz) { int i = 0; for(i = 0; i < sz; i++) { printf(" %d", arr[i]); } printf("\n"); } void move(int arr[], int sz) { int* left = arr; int* right = arr + sz - 1; //从右向左找一个偶数,停下来 while(left < right) { while((left < right) && (*left) % 2 == 1) { left++; } //从右向左找一个奇数,停下来 while((left < right) && (*right) % 2 == 0) { right--; } //奇数和偶数交换 if(left < right) { int tmp = *left; *left = *right; *right = tmp; } } } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int sz = sizeof(arr) / sizeof(arr[0]); print(arr, sz); move(arr, sz); print(arr, sz); return 0; }
-
C语言实现数组的排序——冒泡排序
2022-02-28 16:49:10目标:冒泡排序实现数组的排序 代码: #include <stdio.h> void sort(int* array, int n) //具体实现的函数 { for (int i = 0; i < n - 1; i++) //需要嵌套循环 { for (int j = 0; j < n - 1 - i; j...目标:冒泡排序实现数组的排序
代码:#include <stdio.h> void sort(int* array, int n) //具体实现的函数 { for (int i = 0; i < n - 1; i++) //需要嵌套循环 { for (int j = 0; j < n - 1 - i; j++) { if (array[j] > array[j + 1]) //如果前面的数大于后面的数,这两个数就要交换位置,实现较小的数在前,较大的数在后。 { int tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; } } } } int main() { int n = 0; scanf("%d", &n); int array[100] = { 0 }; for (int i = 0; i < n; i++) { scanf("%d", &array[i]); } sort(array, n); for (int i = 0; i < n; i++) { printf("%d", array[i]); } return 0; }
-
c语言合并两个已排序数组的示例(c语言数组排序)
2020-09-04 13:32:43如何将两个已排序数组合并成一个排序数组,下面我们给出使用c语言合并两个已排序数组的示例,需要的朋友可以参考下 -
用C语言实现数组元素最大值/最小值查找、数组元素平均值计算、数组元素排序等功能
2020-06-24 17:24:48利用C语言可以实现对数组的各种操作,如输入数组元素,输出数组元素、求数组元素平均值、输出数组元素最大值、输出数组元素最小值、查找某数值元素是否存在、给数组元素排序等功能。本压缩文件中是上述功能对应的... -
C语言:数组排序(选择法排序)
2021-11-08 08:21:28选择法排序指每次选择所要排序的数组中的最小(最大)的数组元素,将这个数组元素的值与后面没有进行排序的数组元素的值互换。 下面以9、6、15、4、2为例,进行选择排序 元素[0] 元素[1] 元素[2] 元素...选择法排序指每次选择所要排序的数组中的最小(最大)的数组元素,将这个数组元素的值与后面没有进行排序的数组元素的值互换。
下面以9、6、15、4、2为例,进行选择排序
元素[0] 元素[1] 元素[2] 元素[3] 元素[4] 起始值 9 6 15 4 2 第一次 2 6 15 4 9 第二次 2 4 15 6 9 第三次 2 4 6 15 9 第四次 2 4 6 9 15 结果 2 4 6 9 15 可以发现,有n个数进行选择法排序时,需要执行n(n-1)/2次比较,n-1次交换
下面通过程序来实现(10个元素从小到大排序)
#include<stdio.h> int main() { int arr[10]; /*定义一个10个元素的数组*/ int i,j,temp,pos; /*temp记录最小值,pos记录最小值位置*/ for(i=0;i<=9;i++) /*输入各个数字*/ { scanf("%d",&arr[i]); } for(i=0;i<9;i++) /*10个数排序,则只需执行9次*/ { temp=arr[i]; /*记录此时的值为最小值*/ pos=i; /*记录该元素的位置*/ for(j=i+1;j<10;j++) /*与后面的元素逐个比较*/ { if(arr[j]<temp) /*若temp中的数大于下一位,则temp赋值为下一位*/ { temp=arr[j]; pos=j; } } arr[pos]=arr[i]; /*交换两个元素的值*/ arr[i]=temp; } for(i=0;i<=9;i++) /*输出排序后的数组*/ { printf("%d ",arr[i]); } return 0; }
由此可以得出选择法排序简单容易实现,适用于数量较少的排序
-
C语言:数组排序(冒泡法排序)
2021-11-08 19:51:45冒泡法排序指的是在排序时,每次比较数组中相邻的两个数组元素的值,将较大的数(从小到大排列)排在较小的数后面。 以数字9、6、15、4、2为例 元素[0] 元素[1] 元素[2] 元素[3] 元素[4] 起始值 ... -
【C语言】数组排序方法总结
2021-01-25 17:15:32void bubble_sort(int* p, int len)//函数实现 { int i = 0; int j = 0; for (i = 0; i < len - 1; i++)//需要进行len-1趟 { int flag = 1;//flag=1,说明已经排好序 for (j = 0; j < len - -
【C语言】数组排序法(升序)
2021-04-19 22:59:09一、冒泡排序 主要思路:相邻两个数的比较交换 #include<stdio.h> int main( ) { int a[10],temp=0; for(int i=0;i<10;i++) { scanf("%d",&a[i]); } for(int k=0;k<9;k++) { for(int j=1;... -
利用C语言实现数组的排序(简单选择排序法)
2019-04-16 11:12:49简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。 #pragma once #include <stdio.h> ... -
C语言实现四种数组排序方法
2020-04-28 11:37:39插入法排序(升序) #include<stdio.h> void main() { int i,a[10],temp,pos; printf("为数组元素赋值:\n"); for(i=0;i<10;i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } for(i=1;i<... -
C语言成绩数组排序
2020-12-26 19:09:23由键盘输入30名同学的成绩,按成绩由高到低去排序并输出排序后的成绩。 主函数输入30名学生的成绩,输出排序后的成绩; 子函数中对30个成绩排序; #include<stdio.h> #define N 30 int main() { int ans[N],i... -
利用C语言实现数组的排序(直接插入排序法)
2019-04-16 11:59:01直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 #pragma once #include <stdio.h> int insort(int s[], int n) { int i,j; for(i=2;i<=... -
C语言:数组排序(插入法排序)
2021-11-11 12:42:13插入法相对较复杂,基本原理是抽出一个数据,在前面数据中寻找相应的位置插入,然后继续下一个数据,直到排序完成 以9、6、15、4、2为例来进行插入法排序 元素[0] 元素[1] 元素[2] 元素[3] 元素[4... -
C语言实现数组从大到小排序
2020-03-14 11:49:28使用C语言实现数组 3,7,9,11,0,6,7,5,4,2 从大到小排序 #include<stdio.h> void reserve(int x[], int n); //函数声明 void main (){ int a[10] = {3,7,9,11,0,6,7,5,4,2}; //要排序的数组元素 int i; ... -
C语言结构体数组冒泡排序
2021-12-07 23:03:25#include<stdio.h> #define N 3 int main() { struct Book{ char num[10]; char name[10];... char writer[10];... scanf("%s%s%s%f",books[i].num,books[i].name,books[i].writer,&... -
利用C语言实现数组的排序(冒泡排序法)
2018-09-27 20:11:26#include <stdio.h> int sort(int a[10]) { int i,j,tmp; for(i = 0;i<9;i++) { for(j = i+1;j<10;j++) { if(a[i] > a[j]) { tmp = a[i];... ... -
【C语言】数组排序,并返回排序后的数组对应原数组的下标
2020-07-24 19:52:03#include<stdio.h> #include<stdlib.h> void sort(int* a, int length, int* b) { int i,j, t1, t; for(j=0; j<length; j++) for(i=0; i<length-1-j; i++) if(a[i]<a[i+1]) ...... -
c语言数组实现冒泡排序
2021-11-08 17:57:48数组实现冒泡排序什么是冒泡拍排序用数组实现总结 什么是冒泡拍排序 首先,需要了解一下什么是冒泡排序,定义:冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素... -
C语言 数组排序 – 冒泡排序
2022-03-13 21:43:45数组排序,最基础的排序法,冒泡排序,一看就懂,所以这篇我没有出原理图解,后期依次会出选择排序和快速排序 -
C语言 结构体数组按字段排序
2020-10-27 10:13:21先按照课程编号从小到大排序,再按照成绩从高到底的顺序进行排序. -
2020-12-13:C语言中实现数组排序的库函数(qsort()),尝试demo
2020-12-14 22:29:07C语言库函数 - qsort() 标准库 <stdlib.h> 描述 C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void)) 对数组进行排序。 声明 下面是 qsort() 函数的声明。... -
C语言 数组排序 – 快速法排序 - C语言零基础入门教程
2021-08-18 10:01:38目录 一.简介 二....三....四....零基础 C/C++ 学习路线推荐 :&...在 C 语言中常见的数组排序一共有四种: 1.冒泡法排序 2.选择法排序 3.插入法排序 4.快速法排序 二.数组快速法排序原理 快速排序法号称是目前最优秀的算法 -
C语言实现数组快速排序算法
2015-02-26 10:53:01C语言实现数组快速排序算法 快速排序算法,顾名思义,是迄今为止发现的速度最快的排序算法。快速排序算法采用分治的思想,首先在要排序的序列{5,8,7,6,4,3,9}中选取一个基准数(一般选取序列的第一个,其实选取哪个... -
C语言 数组 冒泡排序法
2021-07-15 13:01:54C语言 数组 冒泡排序法 以从小到大排序为例,冒泡排序的整体思想是这样的: 从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第一轮的比较,就... -
C语言 数组中重复的数字分析及方法
2020-12-25 19:32:38C语言 数组中重复的数字解决方法: 题目:在一个长度为n的数组里的所有数字都在0-n-1的 范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字... -
C语言将数组进行排序
2019-03-17 20:08:15C语言将数组进行排序 思维:冒泡法排序 #include <stdio.h> int main() { int a[3] = { 1, 5, 7 }; int i = 0; int j = 0; for (i = 0; i < 2; i++) { for (j = 0; j < 2 - i; j+... -
数据结构入门——数组篇(c语言实现数组,附源码)
2020-08-01 14:12:35一、数组的定义 数组是多个有序数据的集合(有序:地址连续),数组中的每一个元素都属于同一数据类型。 二、数组的声明 一维数组 一维数组声明的简单形式: 类型说明符 数组名 [整数类型表达式]; 其中,类型说明符...