目录
在学习算法时,我们必须有算法思想。算法思想,是解决问题的关键,而算法思想是这么练成的?我认为的是->刷题、刷题、还是刷题。不管是OJ、ACWing还是Leetcode(从易到难排序),只有不断地刷题,重复的刷题,才能在算法上有突破。
1.交换排序
定义:所谓交换,就是根据序列两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:讲j6ianzhi的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
博主觉得,交换排序是最好理解也是最好上手的。首先我们从i位数开始第一层循环,然后内部从第i+1位数开始循环,如果后面有数比第i位数小,那么就交换。以第一层为例,当i=1的内部循环结束后,那么此时第一位必定是最小的,以此类推。
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
//数组有10个空间
int nums[10]={9,2,7,8,1,6,3,5,4};
for(int i=0;i<9;i++){
for(int j=i+1;j<10;j++){
if(nums[i]>nums[j]){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
}
}
for(int i=0;i<10;i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
2. 冒泡排序
定义:冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,即说该数列已经排序完成
冒泡排序不是很好理解,它是以一个多个数组中的数为整体进行循环。可以简单地理解为,先找整个数组里面最大的那个数,将其放到最后一位,依次类推。
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
//数组有10个空间
int nums[10]={9,2,7,8,1,6,3,5,4};
for(int i=0;i<9;i++){
for(int j=9;j>i;j--){
if(nums[j]<nums[j-1]){
int t=nums[j];
nums[j]=nums[j-1];
nums[j-1]=t;
}
}
}
for(int i=0;i<10;i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
3.选择排序
定义:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
选择排序也比较容易理解。即先以第i位为最小值,之后开始从i+1位往后遍历,如果有比第i位小的,那么就用min_index和min_value记录下来,当循环结束时,min_index记录的最小值的位置,min_value记录的数组最小值,此时与第i位进行数据交换,以此类推。
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
//数组有10个空间
int nums[10]={2,7,8,1,6,3,5,4,9,0};
for(int i=0;i<9;i++){
//默认最小值
int min_index=i;
int min_value=nums[i];
for(int j=i+1;j<10;j++){
if(min_value>nums[j]){
min_index=j;
min_value=nums[j];
}
}
nums[min_index]=nums[i];
nums[i]=min_value;
}
for(int i=0;i<10;i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
4.插入排序
定义:插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。
插入排序法不是太好理解,但也还可以。首先我们数组中至少需要有两个数(i-1>=0),然后令第i位数为插入的值。如果前面的值比第i位数大,那么就让前面的值往后移动一位。所以,在这个过程中,如果我们以第i位作为插入的值,那么前面的i-1位肯定是递增的。
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
//数组有10个空间
int nums[10]={2,7,8,1,6,3,5,4,9,0};
for(int i=1;i<10;i++){
//前一个数的索引
int index = i-1;
//要插入数的值
int value = nums[i];
while((index>=0)&&(value<nums[index])){
nums[index+1]=nums[index];
index--;
}
nums[index+1]=value;
}
for(int i=0;i<10;i++){
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
本篇blog主要讲的就是如何进行排序。在实战当中主要用到的就是上述的四种排序方法。如果不理解其中数组的排序过程,可以启用debug来一步一步的观察数组是怎么变化的,这样子更加方便大家理解四种排序算法。 ---2022.07.05