C语言之数组


1,数组简介:

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。

2,例子要求:
针对数组这个最基础的数据结构,列举这个数据结构可以支持的操作,并以大O的方式分析各个操作的时间复杂度

3,实现过程:

#include <QCoreApplication>
//数组的基本操作,排序,取最大值,模糊查询某个值

// 【1】数组排序 算法
// 1.1, 冒泡排序 O(n2)
最好的是数组有序情况下为:O(2N),

平均是正常随机乱序为:O(2N),

最差的是数据完全乱序O(n2)。

void BubbleSort(int A[], int N)

{

int tmp;
 for (i = 0; i < N - 1; ++i)
 {
 for (j = 1; j < N - i; ++j)
 {
 if (A[j] > A[j - 1]) //从大到小排序,把较小的交换到后面来
 {
 tmp = A[j - 1];
 A[j - 1] = A[j];
 A[j] = tmp;
 }
 }
 }
}

// 1.2 快速排序,它的平均时间复杂度为O(Nlog2N)
最好的是数组有序情况下时间复杂度为:O(nlogn),
平均是正常随机乱序时平均时间复杂度为:O(nlogn)。 ,
最差的是数据完全乱序O(n^2)。
int Partition(int *arr, int low, int high)
{
 int pivot = arr[low];
 while(low < high)
 {
 while(low < high && arr[high] <= pivot) high--;
 arr[low] = arr[high];
 while(low < high && arr[low] >= pivot) low++;
 arr[high] = arr[low];
 }
 arr[low] = pivot;
 return low;
}

void Qsort(int *arr, int low, int high)
{
 if (low < high)
 {
 int mid = Partition(arr, low, high);
 Qsort(arr, low, mid - 1);
 Qsort(arr, mid + 1, high);
 }
}

// 【2】 数组取最大值 算法
最好情况下,最大值在第一个,时间复杂度为:O(n^2)
平均是,最大值在中间位置,时间复杂度:O(n).
最差是,最大值在末尾,时间复杂度:O(2^n)
int max(int array[],int n);
void main( )
{
 int num[N],count,i,val;
? scanf("%d",&count);
 for (i=0;i<count;i++)
 {
 scanf("%d",&num[i]);
 }
 val=max(num,count);
 printf("%dn",val);
 }

int max(int array[ ],int n)
{
 if (n<=1)
 return(array[0]); // 就一个数,最大值就是自已
 int t=max(array+1,n-1); // 求后面 n-1个数的最大值
 if (t>array[0]) // t 比第一个大,返回最大 t
 return(t);
 else
 return(array[0]); // t小,返回array[0];
}

// 【3】 数组查询是否包含某个值
最好情况下,就是第一个,时间复杂度为O(1);
平均情况下,值在中间,时间复杂度为0(N/2);
最坏情况下,值在末尾或者不存在,时间复杂度为O(N);
int main()
{
 int n,m,i,a[20];
 int find;
 scanf("%d",&n);
 for(i=0;i<n;i++){
 scanf("%d",&a[i]);
 }
 scanf("%d",&m);
 find = -1;
 for(i=0;i<n;i++){
 if(a[i] == m){
 find = i;
 break;
 }
 }

if(find < 0) {
 printf("Non");
 }
 else {
 printf("%dn", find);
 }
 return 0;
}

// 【4】数组输入输出,一时没有想到用什么算法,顺序遍历?

----------------------------------------------------------------------------------------------------------------
<版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!>
原博客地址:    http://blog.itpub.net/26230597/viewspace-1386607/
原作者:黄杉 (mchdba)
----------------------------------------------------------------------------------------------------------------

时间: 2024-10-18 20:57:03

C语言之数组的相关文章

C语言关于数组与指针内容小结

数组的基本概念 什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式]: 其中,类型说明符是任一种基本数据类型或构造数据类型.数组名是用户定义的数组标识符.方括号中的常量表达式表示数据元素的个数,也称为数组的长度.例如: int a[10]; /* 说明整型数组a,有10个元素 */ float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */ char ch[20]; /* 说明字符数组ch,有20个元

C语言——字符数组

在C语言编程中,我们一般用一个字符数组来存放一个字符串.例如,我们想存储这个字符串“http://i.cnblogs.com”,这个字符串一共有20个字符,要存放下这个字符串,我们需要一个长度为21的字符数组.为什么是21个而不是20个呢?在C语言中,字符串数组默认以'\0'结尾,所以我们一共需要一个长度为21的字符数组来存储这个变量. unsigned char text[21] = “http://i.cnblogs.com”; 既然我们已经知道了如何存放一个字符串,那下面我们来讨论另外几个

C语言之数组名的含义

一:一维数组 int a[5]; a:就是数组名.a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值:a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址).a做右值等同于&a[0]; a[0]:表示数组的首元素,也就是数组的第0个元素.做左值时表示数组第0个元素对应的内存空间(连续4字节):做右值时表示数组第0个元素的值(也就是数组第0个元素

【Go语言】【6】GO语言的数组

在<[4]GO语言类型和为类型增加方法>里说过GO语言除了基础类型(如int.float64.complex128等)之外,还有复合类型,其中就包含本文的数组.对于数组大家都不陌生,在C语言中可以这样声明一个一维数组:int arr[10],那么GO语言是怎么定义的呢? 一.数组的声明 1.数组的声明格式为var arrName [num]type,比如: var strArr [10]string     // 声明一个由10个字符串组成的一维字符串数组 var byteArr [32]by

C语言去除数组中重复的字符简单例子

#include <stdio.h> int main(void){ int a[10]={1,2,3,3,4,5,1,3,5,6}; int i,j; int zieo=0; for(i=0;i<10;i++) for(j=i+1;j<10;j++) { if(a[i]==a[j]) { a[j]=0; } } for(i=0;i<10;i++) { if(a[i]!=zieo) { printf("%d\t",a[i]); } } printf(&qu

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

java、C语言实现数组模拟栈

java: public class ArrayStack { private int[] data; private int top; private int size; public ArrayStack(int size) { this.data = new int[size]; this.size = size; this.top = -1; } public boolean isEmpty() { if (this.top == -1) { return true; } return

C语言之数组中你所不在意的重要知识

#include<stdio.h> void simpleArray(); void main() { simpleArray(); } //数组的简单操作 void simpleArray() { //数组的声明并赋值 int c[5] = { 1, 2, 3, 4, 5 }; printf("\nC数组内存中占%d个字节",sizeof(c));// /0在内存中会占一个字节,但是只针对于字符串 printf("\nC数组中有%d个元素",sizeo

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是

C语言一维数组、二维数组、结构体的初始化

C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9. (2)初始化时可以只对一部分元素赋初值.例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0. (3)将数组的元素值全部为0,可以用下面的方法:(方法一)