冒泡排序
给出一个序列a,其中元素个数为n,要求把他们按从小到大的顺序排序。
冒泡排序的本质在于交换,即每次通过比较交换的方式把当前带比较元素的最大值移动到一端,而当剩余的元素减少为0时,排序结束。
下面举个栗子。。
代码实现:
#include<cstdio>
int main(){
int a[10]={3,1,4,5,2};
for(int i=0;i<=5;i++){ //一共比较5趟
for(int j=0;j<4-i;j++){ //每一趟比较5-(i+1)次
if(a[j]>a[j+1]){ //如果前面的数比后面的数大,则向后挪
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
} //每一趟比较都将这组中的最大数向后挪
}
for(int i=0;i<5;i++){
printf("%d\t",a[i]);
}
}
选择排序
简单选择排序,☞对一个序列A中的元素A[1]~A[n],令i从1到n枚举,进行n趟操作,每趟从待排序部分[i,n]中选择最小的元素,令其与带排序部分第一个元素A[i]进行交换,这样元素A[i]就会与当前有序区间[1,i-1]形成新的有序区间[i,1]。于是在n趟操作后,所有元素就会是有序的了。
- 算法实现的逻辑:总共需要进行n趟操作(1=<i<=n),每趟操作选出待排序部分[i,n]中最小的元素,令其于A[i]交换。时间复杂度为O(n^2)。
- 代码如下:
void selectSort(){
for(int i=1;i<=n;i++){ //n趟操作
int k=i;
for(int j=i;j<=n;j++){ //选出[i,n] 中最小的元素,下标为k
if(A[j]<A[k]){
k=j;
}
}
int temp=A[i];
A[i]=A[k];
A[k]=temp;
}
}
插入排序
直接插入排序是指,对序列A的n个元素A[1]~A[n],令i从2到n枚举,进行n-1趟操作。
这个博文挺好的,收藏~https://blog.csdn.net/LLZK_/article/details/51628574
以下转载自上面的博文~
插入排序原理很简单,将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。
下面以升序为例进行一次图解:
代码实现:
//直接插入排序
int A[maxn],n; //n为元素个数,数组下标为0~n-1
void insertSort(){
for(int i=1;i<n;i++){ //进行n-1趟排序
int temp=A[i],j=i; //temp临时存放A[i],j从i开始往前枚举
while(j>1&&temp<A[j-1]){ //只要temp小于前一个元素A[j-1]
A[j]=A[j-1]; //把A[j-1]后移至A[j]
j--;
}
A[j]=temp; //插入位置为j
}
}