1 #include<stdio.h>
2 #include<time.h>
3 #include<stdlib.h>
4 void bubbleSort(int arr[],int arrSize){
5 int tmp = 0;
6 int swap = 1;
7 while(swap){
8 swap = 0;
9 for(int i = 0;i < (arrSize -1);i++){
10 if(arr[i] > arr[i + 1]){
11 tmp = arr[i];
12 arr[i] = arr[i + 1];
13 arr[i + 1] = tmp;
14 swap = 1;
15 }
16 }
17 }
18
19 return;
20 }
21
22 void outArr(char* name, char* time,int arr[],int arrSize){
23 printf("%s %s is: \n",name,time);
24 for(int i = 0;i < arrSize;i++){
25 printf("%d\t",arr[i]);
26 }
27 printf("\n");
28 return;
29 }
30
31
32 void insertSort(int arr[],int arrSize){
33 for(int i = 1;i < arrSize;i++){
34 if(arr[i] < arr[i - 1]){
35 int j = 0;
36 int tmp = arr[i];
37 for(j = i - 1; j >= 0 && tmp < arr[j];j--){
38 arr[j + 1] = arr[j];
39 }
40 arr[j + 1] =tmp;
41 }
42 }
43 return;
44 }
45
46
47 void binaryInsertSort(int arr[],int arrSize){
48 int tmp = 0;
49 int i = 0;
50 int j = 0;
51 int low = 0;
52 int high = 0;
53 for(i = 0;i < arrSize;i++){
54 tmp = arr[i];
55 low = 0;
56 high = i - 1;
57 while(low <= high){
58 int mid = (low + high)/2;
59 if(tmp < arr[mid]){
60 high = high - 1;
61 }
62 else{
63 low = low + 1;
64 }
65 }
66 for(j = i - 1;j >= low;j--){
67 arr[j + 1] = arr[j];
68 }
69 arr[low] = tmp;
70 }
71 return;
72 }
73
74
75 void selectSort(int arr[],int arrSize){
76 for(int i = 0;i < arrSize;i++){
77 int index = i;
78 for(int j = i + 1;j < arrSize;j++){
79 if(arr[j] < arr[index]){
80 index = j;
81 }
82 }
83 if(index != i){
84 int tmp = arr[index];
85 arr[index] = arr[i];
86 arr[i] = tmp;
87 }
88 }
89 return;
90 }
91
92
93
94 int partition(int arr[], int low, int high){
95 int i = low;
96 int j = high;
97 int tmp = arr[low];
98 while(i < j){
99 while(i < j && arr[j] >= tmp){
100 j--;
101 }
102 if(i < j){
103 arr[i] = arr[j];
104 i++;
105 while(i < j && arr[i] <= tmp){
106 i++;
107 }
108 if(i < j){
109 arr[j] = arr[i];
110 j--;
111 }
112 }
113 }
114 arr[i] = tmp;
115
116 return i;
117 }
118
119
120
121 void quickSort(int arr[], int left, int right){
122 if(left < right){
123 int tmp = partition(arr, left, right);
124 quickSort(arr, left, tmp - 1);
125 quickSort(arr, tmp + 1, right);
126 }
127 return;
128 }
129
130
131
132 int main(int argc, char **argv)
133 {
134 int n = 10;
135 int m = 100;
136 int s = 50;
137 int *arr0 = (int *)malloc(sizeof(int)*n);
138 srand((int)time(NULL));
139 for(int i = 0;i < n;i++){
140 *(arr0+i) = rand() % m;
141 //int *(arr1 + i) = rand() % m;
142 //int *(arr2 + i) = rand() % m;
143 //int *(arr3 + i) = rand() % m;
144 //int *(arr4 + i) = rand() % m;
145 }
146
147
148 /*
149 int arr0[] = {42, 93, 64, 15, 26, 57, 48, 79, 80};
150 int arr1[] = {42, 93, 64, 15, 26, 57, 48, 79, 80};
151 int arr2[] = {42, 93, 64, 15, 26, 57, 48, 79, 80};
152 int arr3[] = {42, 93, 64, 15, 26, 57, 48, 79, 80};
153 int arr4[] = {42, 93, 64, 15, 26, 57, 48, 79, 80};
154 */
155 int *ptrArr[] = {arr0};
156 int arrSize = n;
157 outArr("bubbleSort", "before", *(ptrArr + 0), arrSize);
158
159 bubbleSort(*(ptrArr + 0), arrSize);
160 outArr("bubbleSort", "after", *(ptrArr + 0), arrSize);
161 /*
162 outArr("insertSort", "before", *(ptrArr + 1), arrSize);
163 insertSort(*(ptrArr + 1), arrSize);
164 outArr("insertSort", "after", *(ptrArr + 1), arrSize);
165 outArr("binaryInsertSort", "before", *(ptrArr + 2), arrSize);
166 binaryInsertSort(*(ptrArr + 2), arrSize);
167 outArr("binaryInsertSort", "after", *(ptrArr + 2), arrSize);
168 outArr("selectSort", "before", *(ptrArr + 3), arrSize);
169 selectSort(*(ptrArr + 3), arrSize);
170 outArr("selectSort", "after", *(ptrArr + 3), arrSize);
171 outArr("quickSort", "before", *(ptrArr + 4), arrSize);
172 quickSort(*(ptrArr + 4), 0, arrSize - 1);
173 outArr("quickSort", "after", *(ptrArr + 4), arrSize);
174 */
175 /*
176 int n = 10;
177 int m = 100;
178 int s = 50;
179 srand((int)time(NULL));
180 for(int i = 0;i < n;i++){
181 printf("%d",rand()%m);
182 printf("\n");
183 }*/
184
185 }
186
187
188
一、rand()
rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。
rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。
在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。
rand()函数需要的头文件是:<stdlib.h>
rand()函数原型:int rand(void);
使用rand()函数产生1-100以内的随机整数:int number1 = rand() % 100+1;
二、srand()
srand()函数需要的头文件仍然是:<stdlib.h>
srand()函数原型:void srand (usigned int seed);
srand()用来设置rand()产生随机数时的随机数种子。参数seed是整数,通常可以利用time(0)或getpid(0)的返回值作为seed。
使用rand()和srand()产生1-100以内的随机整数:
srand(time(NULL));
int number1 = rand() % 100+1;
三、使用rand()和srand()产生指定范围内的随机整数的方法
“模除+加法”的方法
因为,对于任意数,0<=rand()%(n-m+1)<=n-m
因此,0+m<=rand()%(n-m+1)+m<=n-m+m
因此,如要产生[m,n]范围内的随机数num,可用:
int num=rand()%(n-m+1)+m;
其中的rand()%(n-m+1)+m算是一个公式,记录一下方便以后查阅。
比如产生10~30的随机整数:
srand(time(NULL));
int a = rand() % (21)+10;