算法基础-十大排序算法
1. 再看算法
对于一个计算机专业的学生来说,从入门开始就在不断地接触排序算法,我们可以看到每本算法书书都在讲排序,分析各种排序算法的原理,分析他们的时间复杂度、空间复杂度。但是很少有人真正的领悟到要这样做的目的,排序算法为什么这么重要?其实算法重要的是在它的基础性和对数据处理的思想的通用性上,首先我们不得不承认我们所接触的越来越智能化的生活中各种智能的功能的设计和实现过程中都免不了用到各种排序算法,因为计算机在现代社会就是用来对各种数据进行处理的。因为这些算法本来就是计算机和数学领域的大牛们精心设计出来用来处理与数据有关的基础问题的精妙手段,它们本身就极具运用价值。其次,就是这些排序算法设计着眼的角度和对数据处理的思路,这也是最重要的,最需要我们去学习和体会的,因为这些思路和想法往往会潜移默化我们看待问题和解决问题的思路和角度,往往会有惊人的效果。所以对于每一个计算机人,熟练的掌握基础排序算法的实现过程,以及它的设计思路是必备的技能。
下面来看看是哪十个基础算法?
2. 专题开端-选择排序和冒泡排序
a.冒泡排序
冒泡排序,见名知意就是说数组里的较大的元素会像水里的泡泡一样,逐渐上浮,直至数组元素有序(以升序排列为例)。冒泡排序有两种实现方式一种是把大的不断往上冒,还一种是把小的不断往下沉。
先上代码:
#include<iostream>
using namespace std;
int main(){
int i,j,*num,n;
bool flag = true;
cin>>n;
num = new int[n];
for(int i=0;i<n;i++)
cin>>num[i];
for(int i=1;i<=n;i++){
flag = false;
for(int j=0;j<n-1;j++){//这里要保证j+1不会越界,所以j<n-1.
if(num[j]>num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
flag = true;
}
}
if(!flag)//当后面的都已经排序好的时候其实是不需要交换的,所以就会终止循环。
break;
}
for(int i=0;i<n;i++)
cout<<num[i]<<" ";
return 0;
}
我们看到每次循环的时候j都是从0开始的,并且是相邻两个元素的比较,所以第一轮比完了之后会把最大的值放到数组的最后,第二轮的时候会把第二大的值放到数组的倒数第二个位置,以此类推,最后整个数组就会是一个升序数组。
下面我们来看一下冒泡排序的递归实现:
#include<iostream>
using namespace std;
void bubbleSort(int num[],int n){
if(n == 0)
return;
for(int i=0;i<n;i++){
if(num[i] > num[i+1]){
int temp;
temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
}
}
n--;
bubbleSort(num,n);
return;
}
int main(){
int *num,n;
cin>>n;
num = new int[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
bubbleSort(num,n);
for(int i=0;i<n;i++){
cout<<num[i]<<" ";
}
cout<<endl;
}
b.选择排序
选择排序和冒泡排序有一点点像,选择排序是默认前面都是已经排序好的,然后从后面选择最小的放在前面排序好的的后面,首先第一轮循环的时候默认的排序好的为空,然后从后面选择最小的放到数组的第一个位置,第二轮循环的时候默认第一个元素是已经排序好的,然后从剩下的找出最小的放到数组的第二个位置,第三轮循环的时候默认前两个都是已经排序好的,然后再从剩下的选择一个最小的放到数组的第三个位置,以此类推。
下面看一下代码:
#include<iostream>
using namespace std;
int main() {
int i,j,n,*num;
cin>>n;
num = new int[n];
for(int i=0;i<n;i++)
cin>>num[i];
for(int i=0;i<n;i++)//i就是表示已排序好的数组的下标序号
for(int j=i;j<n;j++){
if(num[i]>num[j]){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
for(int i=0;i<n;i++)
cout<<num[i]<<" ";
return 0;
}
下面我们再来看一下选择排序的递归实现:
#include<iostream>
using namespace std;
void selectSort(int num[],int i,int len){
if(i >= len)
return;
for(int j=i;j<len;j++){
if(num[i] > num[j]){
int temp = num[i];
num[i] = num[j];
num[j] = num[i];
}
}
i++;
selectSort(num,i,len);
return;
}
int main(){
int *num,len;
cin>>len;
num = new int[len];
for(int i=0;i<len;i++){
cin>>num[i];
}
selectSort(num,0,len);
for(int i=0;i<len;i++){
cout<<num[i]<<" ";
}
cout<<endl;
return 0;
}