2.6:冒泡、简选、直插、快排,递归,宏
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 else
13 {
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 else
24 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 & 0x5
5 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奇数位为1
13 //a:1010偶数位为1
14 //一个整数32位,十六进制:0x55555555,0xaaaaaaaa
15 //&:按位与全1为1,其余为0
16 //0x55555555 & n :保留奇数位
17 //0xaaaaaaaa & n :保留偶数位
18 //再位运算,奇数位左移1(<<)奇变偶
19 // 偶数位右移1 (>>) 偶变奇
20 //再按位或|,有1为1,全0为0,合并一起
21
22 return 0;
23 }
运行结果: