1. 程式人生 > >C語言(五 可變引數、排序問題)

C語言(五 可變引數、排序問題)

可變引數

有時我們想呼叫一個函式,卻又想給它傳不同數量的引數,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/