赞
踩
冒泡排序是最基础的算法,他是怎么实现的呢,
看这一排数据,我们要让他完成升序,也就是让87631变成13678
冒泡排序是一步一步往下走的先是第一次排序,8,跟后面的4个数排序,
8<7 交换,变成7 8 6 3 1;从8开始比
6<8 交换,变成7 6 8 3 1;还是从8开始
3<8 交换,变成7 6 3 8 1;从8开始
1<8 交换,变成7 6 3 1 8;这样就完成了第一次排序我们的8成功走到了最后
第二次排序
7<6 交换,变成6 7 3 1 8;从7开始
3<7 交换,变成6 3 7 1 8;从7开始
1<7 交换,变成6 3 1 7 8;从7开始
8>7 不交换,不变 6 3 1 7 8,看这样我们就完成了后面两数的排序
我们重复循环这个步骤,最后只剩到了开始从1进行这个过程的时候我们发现已经完成了排序,
所以我们一共需要4次大排序,也就是n-1次排序,n为所要进行排序的有效个数,那么每次进行的小排序要进行多少次呢,8的时候我们进行了4次,也就是8和7,6,3,1都进行了一次比较,我们记下来这个4,到7的时候我们只进行了3次交换,4四次其实是无效的因为我们第一次已经把最大的数字放到了最后,那可能大家有疑问那么,8,9,3,6,1的话那怎么办,一样的
8<9, 不交换, 8 9 3 6 1;
9>3, 交换, 8 3 9 6 1;
9>6, 交换, 8 3 6 9 1;
9>1,交换, 8 3 6 1 9;
这不我们还是把最后一个数放到了对应的位置,所以我们就不用管他了,每次不用管一个,所以每次小排序的次数就是n-i-1;i为0,递增;
现在我们进行代码实现
- #include <stdio.h>
- void bubble(int arr[10],int n)
- {
-
- }
- int main()
- {
- int n;
- int arr[10];
- scanf("%d", &n);
- for( i=0; i<n; i++)
- {
- scanf("%d", &arr[i]);
- }
- bubble(arr,n);
- return 0;
- }

我们创建一个bubble函数专门实现冒泡排序
- void bubble(int arr[10],int n)
- {
- int i, j, k, tmp;
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < n - i - 1; j++)
- {
- if (arr[j] > arr[j + 1])
- {
- tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- }
- }
- }
- }

最后进行打印数组
选择排序的思路是遍历数组,每次那一个最小的数放到前面直到有序
我们依旧用这一列数字来举例;
这个整体的大排序是多少次呢,我们来一步一步分析
第一次我们找到最小的1,把1放到最前面,得到1 8 7 6 3
第二次我们找到除了1以为最小的3,把3放到1后面,得到 1 3 8 7 6
第三次我们找到最小的6,把6放到3后面,得到 1 3 6 8 7
第四次我们找到最小的7,把7放到6后面,得到 1 3 6 7 8
完成升序,我们依旧是n-1次大排序,因为最后一个数在最后一次已经有序了;
那么每次大排序里面的小排序呢,
第一次 我们把8当成min,下标0当做k,如果有比min小的就存起来放到min,下标放到k;
4次循环,也就是8和7比,7和6比,6和3比,3和1比我们找到1,把1和8交换
得到1 7 6 3 8,所以每次小循环我们定义一个j让j=i+1 直到遍历到n-1也就是最后一个数;
我们来进行函数实现
- int main()
- {
- int n;
- int arr[10];
- scanf("%d", &n);
- for (int i = 0; i < n; i++)
- {
- scanf("%d", &arr[i]);
- }
- selectionsort(arr, n);
- for (int i = 0; i < n; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }

- void selectionsort(int arr[10], int n)
- {
- int i, j, k=0, tmp, min;
- for (i = 0; i < n-1; i++)
- {
- min = arr[i];
- k = i;
- for (j = i + 1; j < n; j++)
- {
- if (arr[j] < min)
- {
- min = arr[j];
- k = j;
- }
- }
- tmp = arr[i];
- arr[i] = min;
- arr[k] = tmp;
- }
- }

函数实现;
插入排序的思路就是扑克牌,假若我们手里有13478这样的牌,我们得到一个数字6的牌我们会放哪?是不是会放到4和7之间,这就是插入排序,从头遍历,找到一个数从这个数个前面一个一个向前比,如果比后一个数小比前一个数大就停下,不是就继续向前遍历直到n=0;
还是一刚才的8 7 6 3 1为例嗷;
拿7很8比,7小所以往前走,第一次 7 8 6 3 1;
拿6开始遍历,比8小,往前走,比7小往前走,第二次 6 7 8 3 1;
拿3遍历,比8小往前走,比7小往前走,比6小往前走,第三次 3 6 7 8 1;
拿1遍历,比谁都小走到最前面,第四次 1 3 6 7 8;
-
- void insertionsort(int arr[10],int n)
- {
- int i, j, k, tmp, min;
- for (i = 1; i < n; i++)
- {
- min = arr[i];
- for (j = i-1; j >= 0; j--)
- {
- if (arr[j] > min)
- {
- arr[j + 1] = arr[j];
- }
- else
- break;
- arr[j] = min;
-
- }
- }
- }
- int main()
- {
- int n;
- int arr[10];
- scanf("%d", &n);
- for (int i = 0; i < n; i++)
- {
- scanf("%d", &arr[i]);
- }
- insertionsort(arr, n);
- for (int i = 0; i < n; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }

代码就完成了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。