简单选择排序和冒泡排序的特征归纳

tech2022-10-22  123

选择法+冒泡法(1,2,3,4表示第几趟排序)

冒泡法:

选择法:

/* 选择排序法_实数排序: (升序版) 有助于增强理解的特征:最大比较区间的次数为n-1次 ;最小长度比较区间比较的次数为1次.*/ void sort_select_float(float *a,int n_elements) /* 在内部计数数组的元素个数要求传入的数组有做结尾处理/规整的初始化,干脆就调用该函数之前计数下元素个数 */ { int min = 0 ; int j = 0; float temp = 0; /*LHS表示关系表达式的左边;RHS表示关系表达式的右边; 选中排序:每趟排序共用同一个LHS;单趟排序中:*/ for(int i = 0;i < n_elements - 1;i++) { min = i; /* 找到最小元素所在位置,这里比较边界是将左边界收缩,而右边界不变. */ /*指出比较范围和比较对象*/ /*每一趟:外重循环从LHS∈[0,n-2]中选定一个LHS, 内重循环控制该趟排序的一系列比较中,使RHS∈[LHS+1,n-1]全部依次与该趟指定的这个LHS作比较 */ for( j = i+1 ; j < n_elements ;j++) { if(a[min] > a[j]) { min = j; } } /* 交换元素 */ if(min != i)/* 最终的得到的min和初始值i比较,看是否变化了,当然,也可不比较直接交换. */ { /* 注意不是a[i]和a[j]交换(bubble才这样.) */ temp = a[i]; a[i] = a[min]; a[min] = temp; //printf("%f ",a[i]); } /*监视每一趟的排序结果. for(int i = 0;i < n_elements - 1;i++) printf("%f ",a[i]); printf("\n\n"); */ } } void bubble_int_sort(int *p, int n) { void swap_int_pointer(int *a, int *b); /*冒泡法不需要设立最值flag. */ for (int i = 0; i < n - 1; i++) { /* RHS = LHS+1 ∈ [1,n-1] 单趟比较中:*/ for (int j = 0; j <= n - 2 - i; j++)/*内重循环控制各趟排序的一系列比较中:控制LHS从[0,n-2-i]从0取遍n-2-i(i由外重循环弹出的表示现在是第i趟排序) ;比较表达式的右边RHS = LHS+1 */ /* RHS∈[1,n-1] */ { /*通过改变'<'为'>',可以从降序转为升序; 通过监视*(p+j)和*(p+j+1)可以知道当前(第j组)相邻量的值的情况 */ if (*(p + j) < *(p + j + 1)) /*或者写作if(p[j] < p[j+1])也可以*/ { swap_int_pointer(p + j, p + j + 1); } } } } /* 数字版swap() */ void swap_int_pointer(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
最新回复(0)