1.冒泡排序、简单选择排序、直接插入排序、快速排序(升序)
程序代码:
1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 void Bubble(int arr[],int len);5 void simple_sort(int arr[],int len);6 void insert_sort(int arr[],int len);7 int one_sort(int arr[],int low,int high);8 void output(int arr[],int len);9 void quick_sort(int arr[],int low,int high);10 int main(int argc, const char *argv[])11 {12 int arr[]={23,24,12,5,33,5,34,7};13 int len=sizeof(arr)/sizeof(arr[0]);14 /* //冒泡排序升序15 Bubble(arr,len);16 //简单选择排序升序17 simple_sort(arr,len);18 //直接插入排序升序19 insert_sort(arr,len);*/20 //快速排序21 quick_sort(arr,0,len-1);22 //输出23 output(arr,len);24 return 0;25 }26 //冒泡排序升序27 void Bubble(int arr[],int len)28 {29 for(int i=1;i<len;i++)30 {31 for(int j=0;j<len-i;j++)32 {33 if(arr[j]>arr[j+1])34 {35 int t=arr[j];36 arr[j]=arr[j+1];37 arr[j+1]=t;38 }39 }40 }41 }42 //输出43 void output(int arr[],int len)44 {45 for(int i=0;i<len;i++)46 {47 printf("%-4d",arr[i]);48 }49 puts("");50 }51 //简单选择排序升序52 void simple_sort(int arr[],int len)53 {54 for(int i=0;i<len-1;i++)55 {56 int min=i;57 for(int j=i+1;j<len;j++)58 {59 if(arr[min]>arr[j])60 min=j;61 }62 if(i!=min)63 {64 int t=arr[i];65 arr[i]=arr[min];66 arr[min]=t;67 }68 }69 }70 //直接插入排序升序71 void insert_sort(int arr[],int len)72 {73 //有序序列:第一个 无序序列:剩余元素74 for(int i=1;i<len;i++)75 {76 int j;77 int temp=arr[i];//后移,保存第一个插入元素(arr[1])78 for(j=i-1;j>=0&&arr[j]>temp;j--)//依次和有序序列倒叙比较后移79 arr[j+1]=arr[j];80 arr[j+1]=temp;81 }82 }83 //快速排序(基于有序数列)84 //一次排序85 //返回基准值下标(中间值下标)86 int one_sort(int arr[],int low,int high)87 {88 int key=arr[low];89 while(low<high)//low==high结束90 {91 while(low<high&&key<=arr[high])//倒叙比较92 high--;93 arr[low]=arr[high];94 while(low<high&&key>=arr[low])//正序比较95 low++;96 arr[high]=arr[low];97 }98 arr[low]=key;99 return low;
100 }
101 //快排
102 void quick_sort(int arr[],int low,int high)
103 {
104 //判空判一
105 if(low>=high)
106 return;
107 //一次排序
108 int mid=one_sort(arr,low,high);
109 //递归左子序列
110 quick_sort(arr,low,mid-1);
111 //递归右子序列
112 quick_sort(arr,mid+1,high);
113 }
运行结果:
2.递归函数计算非负整数各个位之和
程序代码:
1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 int DigitSum(int n);5 int main(int argc, const char *argv[])6 {7 int n;8 printf("please enter n:");9 scanf("%d",&n);10 if(n<0)11 printf("num error\n");12 else13 { 14 int sum=DigitSum(n);15 printf("%d\n",sum);16 }17 return 0;18 }19 int DigitSum(int n)20 { 21 if(n==0)22 return 0;23 else24 return n%10+DigitSum(n/10);25 }
运行结果:
3.写一个宏,实现int型整数的二进制位的奇数位和偶数位交换
程序代码:
1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #define SWAP(n) (((n & 0xaaaaaaaa) >> 1) | ((n & 0x55 int main(int argc, const char *argv[])6 {7 int n;8 printf("please enter n:");9 scanf("%d",&n);10 int ret=SWAP(n);11 printf("ret=%d\n",ret);12 //5:0101奇数位为113 //a:1010偶数位为114 //一个整数32位,十六进制:0x55555555,0xaaaaaaaa15 //&:按位与全1为1,其余为016 //0x55555555 & n :保留奇数位17 //0xaaaaaaaa & n :保留偶数位18 //再位运算,奇数位左移1(<<)奇变偶19 // 偶数位右移1 (>>) 偶变奇20 //再按位或|,有1为1,全0为0,合并一起21 22 return 0;23 }
运行结果: