随机生成数组排序的三种方法
在数组元素排列例题中 (整体代码在后面,前面是思路,编译环境 VS2013)
看到例题,我们要生成10w组数据并开始排序,我直接分为两步:
第一步就是生成随机数
第二步就是开始排列
我们开始吧!
用到的系统函数:
下面展示一些
#include <stdio.h> #include <stdlib.h> #include <time.h>//调用时间函数,用来生成随机值
为了体现函数思想,自定义一些函数来辅助编译:
void suiji(int a[],int n);//用于调用生成随机数 void twy1(int a[], int n);//第一种排序方法 void twy2(int a[], int n);//第二种排序方法 void twy3(int a[], int n);//第三种排序方法
这是我的函数主体:
int main() { int a[100000]= { 0 }; printf("现在为您打印10万组数据\n"); suiji(a, 100000); printf("排序结果如下:\n"); //twy1 (a, 100000); //twy2 (a, 100000); twy3(a, 100000); return 0; }
随机函数的实现:
void suiji(int a[], int n) 通过srand(time(NULL));//初始化随机参数 这里利用的是time函数的随机值,然后再用rand()来随机赋值给a[]。 具体代码: void suiji(int a[], int n) { int i = 0; srand(time(NULL));//初始化随机参数 for(i; i < n;i++) { a[i] = rand()%10000;//保证生成数据在10000以内; printf("%d\n",a[i]); } }
第一种排序:
选择排序法
简单的来说就是从最后一个开始一个个和前面比较,把较大的数字放在后面面,一次次的重复,就这样就直接排出来了,我认为和冒泡法思路基本是一样的,只不过,这个选择排序法
是从后面开始排序的,排的是最大值。
具体代码实现:
void twy1(int a[], int n) { int i= 0, j= 0, tmp = 0,k=0; for (i = n - 1; i >= 1; i--) { for (j=0; j <= i - 1; j++) { if (a[j] > a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } for (k; k < n; k++) printf("%-5d", a[k]); }
第二种排序:
冒泡排序法
依次比较相邻两个数的大小,将较大的数放到后面,然后依次循环到最后一个数,那么这最后一个数就是这一列数中最大的一个,然后在用相同的办法比较剩余的数,每次都可以比较出最大的一个数,直到排到最后一个数为止。就是选择排序法的逆用。
具体代码实现:
void twy2(int a[], int n) { int i = 0, j = 0, tmp = 0, k = 0; for (i; i < n; i++) { for (j=1; j < n-i ; j++) { if (a[j]<a[j-1]) { tmp = a[j-1]; a[j-1] = a[j]; a[j] = tmp; } } } for (k; k < n; k++) printf("%-5d", a[k]); }
第三种排序:
直接插入法
这种方法的话,就是不断的提高数组个数,在和前面的比较,找到自己合适的位置,来进行插入,应为你的数组个数是由2,3,4,5,6…一个个提升上来的,所以前面的循序就一定是正确的,就这样。
具体代码实现:
void twy3(int a[], int n) { int i = 0, j = 0, tmp = 0, k = 0; for (i = 1; i < n; i++) { if (a[i] < a[i - 1]) { tmp = a[i]; for (j = i - 1; j >= 0 && a[j]>tmp;j--) a[j + 1] = a[j]; a[j + 1] = tmp; } } for (k; k < n; k++) printf("%-5d", a[k]); }
完整代码:
#include <stdio.h> #include <stdlib.h> #include <time.h>//调用时间函数,用来生成随机值 void suiji(int a[],int n);//用于调用生成随机数 void twy1(int a[], int n);//第一种排序方法 void twy2(int a[], int n);//第二种排序方法 void twy3(int a[], int n);//第三种排序方法 int main() { int a[100000]= { 0 }; printf("现在为您打印10万组数据\n"); suiji(a, 100000); printf("排序结果如下:\n"); //twy1 (a, 100000); //twy2 (a, 100000); twy3(a, 100000); return 0; } void suiji(int a[], int n) { int i = 0; srand(time(NULL));//初始化随机参数 for(i; i < n;i++) { a[i] = rand()%10000;//保证生成数据在10000以内; printf("%d\n",a[i]); } } //第一种排序方法 *****选择排序法***** void twy1(int a[], int n) { int i= 0, j= 0, tmp = 0,k=0; for (i = n - 1; i >= 1; i--) { for (j=0; j <= i - 1; j++) { if (a[j] > a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } for (k; k < n; k++) printf("%-5d", a[k]); } //第二种排序方法*****冒泡排序法***** void twy2(int a[], int n) { int i = 0, j = 0, tmp = 0, k = 0; for (i; i < n; i++) { for (j=1; j < n-i ; j++) { if (a[j]<a[j-1]) { tmp = a[j-1]; a[j-1] = a[j]; a[j] = tmp; } } } for (k; k < n; k++) printf("%-5d", a[k]); } //第三种排序方法*****直接插入法***** void twy3(int a[], int n) { int i = 0, j = 0, tmp = 0, k = 0; for (i = 1; i < n; i++) { if (a[i] < a[i - 1]) { tmp = a[i]; for (j = i - 1; j >= 0 && a[j]>tmp;j--) a[j + 1] = a[j]; a[j + 1] = tmp; } } for (k; k < n; k++) printf("%-5d", a[k]); }