可变参数
有时我们想调用一个函数,却又想给它传不同数量的参数,C语言为我们提供了可变参数这个功能。
#include <stdio.h>
#include <stdarg.h> //要想使用可变参数,必须引入此头文件
void cal(int num,...){
//to do
}
int main(){
cal(3,2,4,6);
cal(2,3,8);
return 0 ;
}
函数中第一个参数代表后面参数的数量,后面的三个省略号定义了可变参数。
内存管理
id | 函数及其描述 |
---|---|
1 | void *calloc(int num ,int size) 在内存中动态分配num个长度为size的连续空间,并将每一个字节都初始化为0 |
2 | void free (void *address) 释放指针address指向的内存块,释放的是动态分配的内存 |
3 | void *malloc(int num) 在堆区分配制定大小的内存空间,不进行初始化 |
4 | void *realloc(void *address, int newsize) 重新分配内存,内存大小扩展到newsize |
在程序退出后系统会自动释放分配的内存,但是要在不需要内存或要增大内存空间时,要realloc或free掉内存。
排序问题
1、冒泡排序
重复得比较相邻两个变量的大小,每次确定剩余元素中的最小(大)变量。
#include <stdio.h>
void swap(int arr[],int len){
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;
}
}
}
}
int main(){
int arr[] = {22,58,44,35,14,12,1,6,98,45,63,74};
int len = (int)sizeof(arr)/sizeof(*arr); //sizeof(arr)表示数组arr所占内存大小,siazeof(*arr)表示数组arr中第一个元素的内存大小,整个表达式就是数组的长度。
swap(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d",arr[i]);
}
return 0;
}
2、选择排序
选择排序就是每次从剩下的所有元素中选出最小(大)的元素按顺序排列。
#include <stdio.h>
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len)
{
int i,j;
for (i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (j = i + 1; j < len; j++)
if (arr[j] < arr[min])
min = j;
swap(&arr[min], &arr[i]);
}
}
3、插入排序
插入排序是一种简单直观的排序方法,通过构建有序列表,将未排序数列从后向前扫描,将元素插入到合适的位置,已排序的元素可能会不断向后挪位,为新元素空出位置。
void insertion_sort(int arr[], int len){
int i,j,temp;
for (i=1;i<len;i++){
temp = arr[i];
for (j=i;j>0 && arr[j-1]>temp;j--)
arr[j] = arr[j-1];
arr[j] = temp;
}
}
4、希尔排序
希尔排序可以说是插入排序的升级版,利用增量递减排序,首先初始增量我们设为数组长度除以2,也就是希尔增量,每个循环增量都减半。
void ShellSort(int arr[], int len){
int increment;
int i,j;
int temp;
for(increment = len/2; increment > 0; increment /= 2) //用来控制步长,最后递减到1 {
for(i = increment; i < len; i++) {
temp = arr[i];
for(j = i - increment; j >= 0 && temp < arr[j]; j -= increment) {
arr[j + increment] = arr[j];
}
arr[j + increment] = temp; }
}
}
图片作者: dreamcatcher-cx出处: http://www.cnblogs.com/chengxiao/