必须知道的C语言八大排序算法(收藏)

2020-01-06 17:55:59刘景俊

分析:

设树深度为k,c语言,八大排序算法,c语言排序算法。从根到叶的筛选,元素比较次数至多2(k-1)次,交换记录至多k 次。所以,在建好堆后,排序过程中的筛选次数不超过下式: 

                                c语言,八大排序算法,c语言排序算法

而建堆时的比较次数不超过4n 次,因此堆排序最坏情况下,时间复杂度也为:O(nlogn )。

5. 交换排序—冒泡排序(Bubble Sort)

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

冒泡排序的示例:

c语言,八大排序算法,c语言排序算法

算法的实现:


void bubbleSort(int a[], int n){ 
 for(int i =0 ; i< n-1; ++i) { 
 for(int j = 0; j < n-i-1; ++j) { 
 if(a[j] > a[j+1]) 
 { 
 int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp; 
 } 
 } 
 } 
}

冒泡排序算法的改进

对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。本文再提供以下两种改进算法:

1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

改进后算法如下:


void Bubble_1 ( int r[], int n) { 
 int i= n -1; //初始时,最后位置保持不变 
 while ( i> 0) { 
 int pos= 0; //每趟开始时,无记录交换 
 for (int j= 0; j< i; j++) 
 if (r[j]> r[j+1]) { 
 pos= j; //记录交换的位置 
 int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp; 
 } 
 i= pos; //为下一趟排序作准备 
 } 
}