教育类网站素材,搭建一个商城需要多少钱,国家工信部备案网站,网站编辑工作一#xff0c;选择排序
1#xff0c;基本知识
对排序的双层 for 循环的理解#xff1a;外层 控制趟数#xff0c;里层 不断地对数组进行遍历。
2#xff0c;逐层深入
经典的选择排序GIF动图#xff0c;如下#xff1a; 关键部分#xff1a;
Ⅰ#xff0c;从数组中…一选择排序
1基本知识
对排序的双层 for 循环的理解外层 控制趟数里层 不断地对数组进行遍历。
2逐层深入
经典的选择排序GIF动图如下 关键部分
Ⅰ从数组中的第一个元素开始不断地选定一个元素引用其下标 markindex如下代码与其之后的元素进行比较如果发现了一个当前较小的元素就更新下标直到比较完为止。
Ⅱ既然已经找到了当前最小元素接下来就要交换位置了。交换两数就必须用到中间变量。(如下代码)
理解了如上两个关键部分那么要进行选择排序就不难了。
3解决问题
解决关键部分 Ⅰ代码如下
void sort(int arr[],int sz)
{int i 0;for (i 0; i sz - 1; i) //外层循环控制趟数{int markindex i; //将当前假设的最小数的下标赋值给markindexint j 0;for (j i 1; j sz; j) //里层循环遍历数组进行比较{if (arr[j] arr[markindex]) //若发现了更小的数就更新下标这样可以保证找到当前最小值{markindex j;}}swap(arr, i, markindex); //交换两数的函数}
}//排序完毕
解决关键部分 Ⅱ 代码如下
void swap(int arr[], int i, int markindex)
{int temp 0; //交换两数的值必须用到中间变量temp arr[markindex];arr[markindex] arr[i];arr[i] temp;
}//交换完毕
操作完毕如下是总代码
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
//思路
//1从头到尾依次假设最小值之后不断的与其后的数进行比较若发现了更小的数就更新下标
//2使用markindex来标记下标
//3使用sort来进行排序
//4使用swap来进行两数的交换void swap(int arr[], int i, int markindex)
{int temp 0; //交换两数的值必须用到中间变量temp arr[markindex];arr[markindex] arr[i];arr[i] temp;
}//交换完毕void sort(int arr[],int sz)
{int i 0;for (i 0; i sz - 1; i) //外层循环控制趟数{int markindex i; //将当前假设的最小数的下标赋值给markindexint j 0;for (j i 1; j sz; j) //里层循环遍历数组进行比较{if (arr[j] arr[markindex]) //若发现了更小的数就更新下标这样可以保证找到当前最小值{markindex j;}}swap(arr, i, markindex); //交换两数的函数}
}//排序完毕
int main()
{int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]); //数组元素个数for (int i 0; i sz; i){scanf(%d, arr[i]);}//输入完毕//开始操作sort(arr,sz);for (int i 0; i sz; i){printf(%d , arr[i]);}//打印完毕return 0;
}
选择排序解决。
二冒泡排序
1基本知识
Ⅰ相邻两数不断进行比较大数下沉小数上升就如同气泡一样。
Ⅱ对双层 for 循环的理解 外层 控制趟数 里层 不断的对数组中的元素进行遍历。
2逐层深入
经典的冒泡排序GIF动图如下 关键部分
Ⅰ观察动图两两元素不断进行比较大数往后走小数往前走。
Ⅱ对趟数的计算假设有 n 个元素则最多进行 n-1 趟。
Ⅲ对每一趟比较次数的计算假设有 n 个元素 i 是趟数从 1 开始 递增则每一趟比较 n - i次。
Ⅳ交换两数必须用到中间变量。
3解决问题
综合分析代码如下
void sort(int arr[], int sz)
{int i 0;for (i 1; i sz; i) //外层循环控制趟数{int j 0;for (j 0; j sz - i; j) //里层循环进行排序{int temp 0; //交换两数的值if (arr[j] arr[j 1]){temp arr[j 1];arr[j 1] arr[j];arr[j] temp;}}}
}//排序完毕
优化定义 flag 来记录 是否进行了交换如果在某一趟中已经排好序了那么就不用再往下进行了直接打印。
代码如下
void sort(int arr[], int sz)
{int i 0;for (i 1; i sz; i) //外层循环控制趟数{int j 0;int flag 1;for (j 0; j sz - i; j) //里层循环进行排序{int temp 0; //交换两数的值if (arr[j] arr[j 1]){flag 0;temp arr[j 1];arr[j 1] arr[j];arr[j] temp;}}if (flag 1){break;}}
}//排序完毕
操作完毕以下是总代码
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
//思路
//1冒泡排序即大的数往底下沉小的数像气泡一样往上浮
//2关键部分Ⅰ有n个数则最多排n-1趟
// Ⅱ每一趟排n-i次假设有10个乱序的数第一趟排9次第二趟排8次第n趟排10-i次i是趟数
//3优化
// 定义一个旗帜若发现某趟排序中没有数交换位置就说明已经排好序了不需要再往下进行了
//
void sort(int arr[], int sz)
{int i 0;for (i 1; i sz; i) //外层循环控制趟数{int j 0;int flag 1;for (j 0; j sz - i; j) //里层循环进行排序{int temp 0; //交换两数的值if (arr[j] arr[j 1]){flag 0;temp arr[j 1];arr[j 1] arr[j];arr[j] temp;}}if (flag 1){break;}}
}//排序完毕int main()
{int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//数组中的元素个数for (int i 0; i sz; i){scanf(%d, arr[i]);}//输入完毕//开始排序sort(arr, sz); //排序的函数//排序完毕for (int i 0; i sz; i){printf(%d , arr[i]);}//打印完毕return 0;
}
冒泡排序解决。 以上GIF动图均出自于这篇文章。 如需借用请在评论区说明之后私聊我哦我发送给您。 总结选择排序与冒泡排序是最基本的排序算法时间复杂度较高最坏情况下为 On^2)。接下来随着学习的不断深入我会逐步介绍 插入排序 快速排序 等排序算法敬请期待
感谢大家阅读