本实验用例取材于郭炜的《程序设计与算法》
在科班眼中,最牛逼的一个课程就是数据结构,掌握数据结构就是掌握程序的半边天下,就犹如worth提出的:“数据结构+算法=程序设计”本次给出插入、选择、冒泡源码是希望我们能及时掌握这些背后的真正门道,以至于强人一头!
一、选择排序
#include<iostream>
#include<cstring>
using namespace std;
void SelectionSort(int a[],int size){
for(int i=0;i<size-1;i++){
int temp = i;
for(int j=i+1;j<size;j++){
if(a[j]<a[temp])
temp = j;
}
int tp = a[i];
a[i] = a[temp];
a[temp] = tp;
}
}
int main()
{
int a[5]={3,5,8,2,7};
for(int i=0;i<5;i++)
cout << a[i] << "," ;
SelectionSort(a,5);
cout << endl;
for(int i=0;i<5;i++)
cout << a[i] << "," ;
return 0;
}
总结:代码核心在于,从第一个元素开始,往后面进行比较,找到最大(最小)的进行标记,遍历一行之后进行交换,时间复杂度O(n)
二、插入排序
#include<cstring>
#include<iostream>
using namespace std;
void InsertionSort(int a[],int size)
{
for(int i=1;i<size;i++){
for(int j=0;j<i;j++){
if(a[j]>a[i]){
int temp = a[i];
for(int k=i;k>j;--k)
a[k]=a[k-1];
a[j]=temp;
break;
}
}
}
}
int main(){
int a[5]={3,5,8,2,7};
for(int i=0;i<5;i++)
cout << a[i] << "," ;
InsertionSort(a,5);
cout << endl;
for(int i=0;i<5;i++)
cout << a[i] << "," ;
return 0;
}
总结:将数组分为左右两边,左边无序,右边有序,目标将无序的数字插入到有序之中,直到无序的数组元素个数变成0,另外,有一个特殊的小技巧就是挪动元素,这也是数据结构中线性表顺序存储的插入核心算法,希望值得领会!
三、冒泡排序
#include<iostream>
using namespace std;
void BubbleSort(int a[],int size){
for(int i=size-1;i>0;--i){
for(int j=0;j<i;++j){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main()
{
int a[5]={3,5,8,2,7};
for(int i=0;i<5;i++)
cout << a[i] << "," ;
BubbleSort(a,5);
cout << endl;
for(int i=0;i<5;i++)
cout << a[i] << "," ;
return 0;
}
总结:冒泡排序将数组分为左右两边,每次比大小就交换,左边有序,右边无序,将数字从无序像泡泡一样吹上来,冒泡排序算法应运而生!