1--桶排序(简易版)
“史上最快最简单的排序”
桶排序,顾名思义就是就是排将不同数据存入相应“木桶”,这里的木桶就就是设立的数组。
输入需要排序的数,将每一个数字对应的数组中的元素加1,最后进行遍历,就可以简单的实现升序或者降序操作。
代码如下:
#include<stdio.h>
int main()
{
int book[1005]={0};//数组设置要尽可能大,不然会发生越栈
int n,t;
printf("输入排序数字数量\n");
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&t);
book[t]++;
}
for(int i=0;i<=1000;i++){
if(book[i]>0){
for(int j=1;j<=book[i];j++){//正序输出就是升序排列
printf("%d ",i);
}
}
}
return 0;
}
理解感悟:
简易桶排序并非是直接对数据进行排序,而是用数组中元素序号来代替数据,利用数组元素储存按照一定顺序,序号排布按照升序来实现对于未知数据的排序。
比起排序,更像是一种取巧的输出方法!。
缺点:当遇到跨度较大的数时,太太太浪费空间了!!!譬如2、200001、1000;仅仅只是三个数而已,就需要申请一个巨大的空间来存放数组,而只是用了一点点,缓慢又浪费!
优点:从缺点可以看出,当数字重复度较高,且数值都较小,还比较接近时,适用于此方法;
2--冒泡排序
“好邻居,我们俩换换位置吧!”
关于冒泡排序,同样的,我们还是顾名思义一下子,冒泡冒泡,就可以理解为鱼儿在水底吐泡泡,泡泡从水底上升,当然是以一定的顺序,是大的气泡一次次的往上升!是相邻之间不断变化的关系!
冒泡排序的基本思想是:每次比较相邻的两个元素,如果顺序错误(不是按照我们预想中的话),就交换顺序;
代码如下:
#include<stdio.h>
int main()
{
printf("请输入需要排序的数字的个数:\n");
int n;
scanf("%d",&n);
int a[1000]={0};//设置数组来储存数据
for(int i=0;i<n;i++){
scanf("%d",&a[i]);//输入每一个数字到数组中
}
for(int i=0;i<n;i++){//第一次遍历,次数是数字的个数
for(int j=0;j<n-i-1;j++){//第二次遍历,是将大的往后排
if(a[j]>a[j+1]){
int swap = a[j];//设置第三个变量,进行临时储存
a[j] = a[j+1];
a[j+1] = swap;
}
}
}
for(int i=0;i<n;i++){//简单的遍历输出
printf("%d ",a[i]);
}
return 0;
}
啊,真是一场酣畅淋漓的排序啊!
冒泡排序的重点核心就是双重嵌套循环,不断大(小)的项往后排,越接近最后,进行的操作越少,这是其隐藏的一点。
就是感觉哪里不太对,这要是数字多一点,这个时间复杂度有点太高了吧!(N*N)
3--快速排序
“传说中最常用的排序”
冒泡排序简单是简单,但是当数据量一旦增大,冒泡排序就显得有点鸡肋了;此时就需要我们的主角--快速排序出厂了!
选择排序的核心目的就是找到基准数,通过遍历交换后使得基准数的左边全是比它小的数,右边全是比它大的数;此时,由于基准数的初次分割,两边的数据进行的一定程度的分类(二分法的内涵!!!),随后用同样的方法处理两边的数组(说人话就是不断二分!!!)。
代码如下:
#include<stdio.h>
int a[101]; //全局变量
void quicksort(int left,int right)//传入函数的是序号
{
int i,j,t,temp;
/*i,j分别表示从左右开始查找,t是交换元素使用,
temp是标记元素,是参照!*/
if(left>right) return ;//由于使用递归,要判断错误
temp = a[left];
i = left;
j = right;
while(i!=j)
{
//顺序很重要,先要从右往左找
while(a[j]>=temp&&i<j) j--;
//再从左往右找
while(a[i]<=temp&&i<j) i++;
if(i<j){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//当i和j相等时,代表查找到了尽头,此时交换i(j)和标记元素位置
a[left] = a[i];
a[i] = temp;
//二分法分出来的位置,使用递归进行同样处理
quicksort(left,i-1);
quicksort(i+1,right);
return ;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
quicksort(1,n);
for(int j=1;j<=n;j++){
printf("%d ",a[j]);
}
return 0;
}
快速排序的核心就在于:找到基准点,利用二分法的思维来对运算时间进行减半!对于其余数字在基准点的两边进行简单的处理,后运用递归处理!
4--选择排序
“符合人脑思路的方法”
主要思路:从数列中选择出一个最小值,放在数列最前面,随后在从第二个开始重复进行这一动作。
#include<stdio.h>
int main()
{
int n,a[100]={0},i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){//第一次循环
int max = i;//标记元素下标,每一轮的最大值
for(int j = i;j<n;j++){//第二轮循环,确定最大值
if(a[j]>a[max]) max = j;
}
//第二轮循环结束,交换首位元素与最大值
int temp = a[i];
a[i] = a[max];
a[max] = temp;
//随后开启的又一轮就可以从第二个元素开始遍历
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
选择排序就好比人来挑选一样,每次都找到一个最大(小)的,将它挑选出来放置到数列首(尾),一轮又一轮后完成排序操作。