初学C语言3.6-快速排序,动态内存管理

快速排序
基本思想:通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,重复上述步骤直到排序完成

例:

#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;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值