选择排序法:从数组中找到最小值排在首位,再从剩余值中选择最小值排到第二位,以此类推
思路:1.第一次遍历数组时找出这个数组中的最小值所对应的下标。然后,把数组中最小值与数组首位元素做交换,从而把最小值放在首位。2.第二次大循环时,数组的遍历从1号下标开始,从剩余数据中找到最小值所对应的下标。然后与arr[1]做交换。
代码如下,给定数组
void select(int* arr, int len) {
int min_index, temp; //定义最小值所对应的下标
for (int i = 0; i < len; i++) {
min_index = i;
for (int j = i + 1; j < len; j++) { //找出最小值所对应的下标
if (arr[min_index] > arr[j]) {
min_index = j;
}
}
temp = arr[min_index]; //第一次大循环交换最小值与数组0号下标的值
arr[min_index] = arr[i];//第二次大循环交换剩余数中最小值与数组1号下标的值,一直到结束
arr[i] = temp;
}
}
int main() {
int arr[] = { 5,7,9,4,3,6,1,2 };
int len = sizeof(arr) / sizeof(arr[0]);
select(arr, len);
for (int i = 0; i < len; i++) {
printf("%3d", arr[i]);
}
return 0;
}
结果如下:
冒泡排序法,给定数组,两个for循环嵌套 ,里面的for循环用来找出数组中的最大或者最小值放在数组最末位,就像瓶子中水里面冒的气泡一样,最值放到最后。第二个for循环用来将数组中剩余没有排好的数进行多次循环来排列。
封装函数代码如下
void bubble(int* arr, int len) {
int temp;
for (int i = 0; i < len; i++) { //外层for循环,可以将下面没有完全排好的,进行多次循环重排
for (int j = 0; j < len-1; j++) {
if (arr[j] > arr[j + 1]) { //前者大于后者,就交换,一遍下来,最大值就到了最后面
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
这个代码有弊端,如果数组中的数据稍微比较有序,但它会进行多次没有必要的循环。如何优化来减少不必要的循环次数。1.在for循环之前,定义一个bool类型的变量,bool flag ;2.外层for循环里面flag = false;用假赋值,第二个内层for循环里面flag用true赋值,这样的话,如果数组顺序不对,就会进入内层for循环,flag值就会是true,而如果经历过遍历后,数组中数据已经有序,那么它就不会在进入for循环,flag只就会是false。3.加条件,if(flag == false),就让他退出循环。
代码如下
void bubble(int* arr, int len) {
int temp;
bool flag;
for (int i = 0; i < len; i++) {//外层for循环,可以将下面没有完全排好的,进行多次循环重排
flag = false;
for (int j = 0; j < len-1; j++) {
if (arr[j] > arr[j + 1]) { //前者大于后者,就交换,一遍下来,最大值就到了最后面
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (flag == false) {
break;
}
}
}
int main() {
int arr[] = { 2,1,6,3,5,7,8,9 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble(arr, len);
for (int i = 0; i < len; i++) {
printf("%3d", arr[i]);
}
return 0;
}
退出循环的方法,条件不满足,break,还有返回一个值。