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;