快速排序
基本思想:通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,重复上述步骤直到排序完成
例:
#include<stdio.h>
void quick_sort(int array[],int left,int right){
int i = left,j=right;
int temp;
int pivot;
pivot = array[(left+right)/2];
while(i<=j){
//从左到右摘到大于等于基准点的元素
while(array[i]<pivot) {
i++;
}
//从右到左找到小于等于基准点的元素
while(array[j]>pivot){
j--;
}
//如果i<=j,则互换元素
if(i<=j){
temp = array[i];
array[i]=array[j];
array[j]=temp;
i++;
j--;
}
}
if(left<j){
quick_sort(array,left,j);
}
if(i<right){
quick_sort(array,i,right);
}
}
int main(void)
{
int array[] ={73,108,111,118,45,70,89,90,29,119};
int i,length;
length = sizeof(array)/sizeof(array[0]);
quick_sort(array,0,length-1);
printf("排序后的结果是:");
for(i=0;i<length;i++){
printf("%d ",array[i]);
}
putchar('\n');
return 0;
}
动态内存管理
malloc
申请动态内存
函数原型
void *malloc(size_t size);
malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针
free
释放动态内存
函数原型
void free(void *ptr);
free函数释放ptr参数指向的内存空间。该内存空间必须由malloc,calloc或realloc函数申请
以上两者同时存在,有申请就有释放
内存泄漏
隐式内存泄漏(即用完内存块没有及时使用free函数释放)
丢失内存块地址
以men开头的函数被编入字符串标准库,函数的声明包含在string.h这个头文件中:
-memset --使用一个常量字节填充内存空间
-memcpy --拷贝内存空间
-memmove --转移内存空间
-memcmp --比较内存空间
-memchr --在内存空间中搜索一个字符
使用malloc分配内存空间并用memset()初始化
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
int main(void)
{
int *ptr = NULL;
int i;
ptr = (int *)malloc(N*sizeof(int));
if(ptr == NULL){
exit(1);
}
memset(ptr,0,N*sizeof(int));
for(i = 0;i < N;i++){
printf("%d ",ptr[i]);
}
putchar('\n');
return 0;
}
calloc
申请并初始化一系列内存空间
函数原型
void *calloc(size_t nmemb,size_t size);
calloc函数在内存中动态地申请nmemb长度为size的连续内存空间(即申请的总空间尺寸为nmemb*size),这些内存空间全部被初始化为0
与malloc的区别
calloc函数在申请完内存后,自动初始化为0
malloc不进行初始化操作,数据随机
int *ptr = (int *)calloc(8,sizeof(int));//等于上述代码的11,16行
realloc
重新分配内存空间
函数原型
void *realloc(void *ptr,size_t size);
动态存储输入整数
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int *ptr = NULL;//注意 这里必须初始化为NULL
int i,num;
int count = 0;
do{
printf("请输入一个整数(输入-1表示结束):");
scanf("%d",&num);
count++;
ptr = (int *)realloc(ptr,count*sizeof(int));//动态规划空间
if(ptr == NULL){
exit(1);
}
ptr[count -1] = num;
}while(num != -1);
printf("输入的整数分别为:");
for(i = 0;i < count;i++){
printf("%d ",ptr[i]);
}
putchar('\n');
free(ptr);
return 0;
}