排序算法通过比较进行选择元素的顺序,所以从大到小排序和从小到大排序的原理是相似的,只需要改变比较条件即可,这里采用从小到大的排序方式进行实现。
冒泡排序
冒泡排序的原理:
对于一串序列 a1.......an ,从头开始到末尾,如果当前元素
ai 大于 ai+1,那么就交换,然后继续依次的比较,那么到达 an 的时候,
n位置所放的元素则是这一编下来的最大的元素,这很好理解。
如果有一个最大的元素,从前往后进行比较进行交换位置,
那么若干次交换后大的元素肯定是交换到最后面的位置的。
所以根据这个原理,只需要进行n-1次的遍历就可以让序列有序。
如果一趟下来都没有发生交换,说明序列已经有序,也可以提前退出算法。
void Bubbling(int a[],int n )
{
int i , j , flag = 0 , temp ;
//因为只需要n-1次遍历,所以从i=1开始即可(到最后a[0]固然就是最小的那个元素)
for(i=1;i<n;i++)
{
flag = 0 ;
for(j=0;j<n-i-1;j++)
{
//如果前一个元素大于后一个元素,则进行交换
if(a[i-1]>a[i])
{
flag = 1 ;
temp = a[i] ;
a[i] = a[i-1] ;
a[i-1] = temp ;
}
}
//没有发生一次交换,说明序列有序
if(!flag)
break ;
}
return ;
}
排序结果:
对冒泡排序的算法进行分析,冒泡排序最优的情况就是当数组的排列顺序和目标顺序一致的时候(在这里就是从小到大排序),这时候只需要一趟下来就能使得序列有序也就是O(n),最坏的情况就是排序和预期相反(这里就是从大到小排序),这时候每次遍历都需要进行 n-i-1次交换,时间复杂度为o(n^2),冒泡排序的平均时间复杂度为O(N**2)
选择排序
// An highlighted block
#include<stdio.h>
/*
选择排序的思路:
每次遍历,找出元素中最小或最大的元素,放到序列前端。
就类似于站队一样,每次选择剩下人中,最高或最矮的放到队伍前面,这样执行n-1次就能使得队伍有序,(因为前n-1个有序,最后剩下那个肯定是最大或者最小的那个)
*/
void select_sort(int a[] , int n );
int main(){
int a[10] = {5,8,1,3,46,56,8,7,78,10} , i ;
select_sort(a,10) ;
for(i = 0 ; i < 10 ; i++){
printf("%d ",a[i]) ;
if(i == 9)
printf("\n") ;
}
return 0 ;
}
/*
改函数用于从小到大最数组排序
@ i , j 循环遍历
@ min 用于保存剩余元素中最小元素的下标
*/
void select_sort(int a[] , int n ){
int i , j , min , temp ;
for(i = 0 ; i < n-1 ; i++){
min = i ;
for(j = i+1 ; j < n ; j++){
//用于找到最小的那个元素
if(a[j]<a[min]){
min = j ;
}
}
//交换第i个位置与剩余元素最小的那个元素的位置
temp = a[min] ;
a[min] = a[i] ;
a[i] = temp ;
}
}