标签:
首先初始化了一个MAX大小的数组,用乱序函数将数组打乱,用于测试各个排序函数,先附上要测试的几个基础排序函数,后面附上乱序函数和主调度函数。代码就那么几行,只是注释的思乱占了比较多的行数
快速排序
//快速排序,思想的重点是 递归+分组(分治)+前后交叉操作 void quickSort(int *array, int low, int hight) { //判断是否满足条件 if (hight <= low) //如果只有一个元素或者前后错位了,就不用排序了,一个元素就是成序的 return; //满足排序条件,进入排序部分 int i = low, j = hight; //定义函数内的临时变量为low和hight的副本,避免修改low和 hight,后面还要使用 int temp = array[low]; //对整个序列进行一次筛选,以目标值为分割点,只有当i<j时表示遍历没有完成,需要继续遍历 while (i < j){ while (i<j && array[j]>temp){ j--; } if (i < j){ array[i++] = array[j]; } while (i < j && array[i] < temp){ i++; } if (i < j){ array[j--] = array[i]; } } //循环跳出,证明i=j,遍历相遇,一轮筛选完成,将目标数放在中间 array[i] = temp; //递归部分 //将前半部分交给快排函数 quickSort(array, low, i - 1); //将后半部分交给快拍函数 quickSort(array, i + 1, hight); }
shell排序(基于插入排序)
//shell排序(希尔排序) void shellSort(int *array, int size, int d) { //循环1 控制步长的循环 for (int increment = d; increment > 0; increment /= 2){ //循环2 属于插入排序内容,控制遍历次步长可以访问到的元素 for (int i = increment; i < size; i += increment){ int temp = array[i]; int j = i - increment; //循环3 属于插入排序内容,赋值寻找目前元素可以插入的位置 while (j >= 0 && array[j]>temp){ array[j + increment] = array[j]; j -= increment; } array[j + increment] = temp; } } }
shell排序(基于选择排序)
相比于基于插入排序实现的shell排序,这个看起来循环多,实现的时候逻辑也不简单于基于插入排序,
不知道是我写的问题,还是问题的本身就是这样的,求指教
void shellSort2(int *array, int size, int d) { //循环1,控制步长变化,直到步长为1也执行后结束 for (int increment = d; increment > 0; increment /= 2){ //循环2,找出每组的开头 for (int k = 0; k < increment; k++){ //循环3,属于选择排序范围了,对上面提供的开头的组内元素做选择排序 for (int i = k; i < size - 1; i += increment){ int tempIndex = i; //循环4,属于选择排序 for (int j = i + increment; j < size; j += increment){ if (array[j] < array[tempIndex]){ tempIndex = j; } } if (tempIndex != i){ int temp = array[i]; array[i] = array[tempIndex]; array[tempIndex] = temp; } } } } }
辅助的操作函数,包括 乱序函数,打印数组函数,交换元素值得函数
//交换函数 void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } //乱序函数,通过从后往前遍历数组,使得当前索引的值与随机一个比它索引小的元素交换 void shuffle(int *array, int size) { srand((unsigned int)time(NULL)); for (int i = size - 1; i > 0; i--){ int index = rand() % i; swap(&array[i], &array[index]); } } //打印数组函数 void printArray(int *array, int size) { for (int i = 0; i < size; i++){ printf("%d\t",array[i]); } }
主函数,负责测试各个排序函数
int main() { //定义并初始化数组 int array[MAX] = { 0 }; for (int i = 0; i < MAX; i++){ array[i] = i; } //对数组数据进行乱序 shuffle(array, MAX); //打印乱序后的数组 printArray(array, MAX); //测试各个排序的效果 /*printf("\n快速排序后\n"); quickSort(array, 0, MAX - 1); printArray(array, MAX);*/ printf("\nshell排序后\n"); shellSort(array, MAX, MAX / 2); printArray(array, MAX); return 0; }
标签:
原文地址:http://my.oschina.net/u/2439195/blog/516372