C語言(五 可變引數、排序問題)
阿新 • • 發佈:2018-11-12
可變引數
有時我們想呼叫一個函式,卻又想給它傳不同數量的引數,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/