冒泡排序算法与选择排序算法分析(C描述)

来源:互联网 发布:java和hadoop 编辑:程序博客网 时间:2024/05/22 12:19

1.冒泡排序

#include <stdio.h>void bubble_sort_enhance( int *unsortArray, int size);int main(int argc, char *argv[]){int unsortArray[6] = {2,5,6,4,7,3};bubble_sort(unsortArray,6); for(int i=0;i<6;++i){printf("%d ",unsortArray[i]);}return 0; }void bubble_sort( int *arr, int size){int i,j;for(i=0;i<size;i++){for(j=i+1;j<size;j++){if(arr[j]>arr[i]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp; }}}}


第一次排序:7 2 5 4 6 3
第二次排序:7 6 2 4 5 3
第三次排序:7 6 5 2 4 3
第四次排序:7 6 5 4 2 3
第五次排序:7 6 5 4 3 2
第六次排序:7 6 5 4 3 2
时间复杂度分析。其外层循环执行 N 次。内层循环最多的时候执行N-1次,最少的时候执行0次,平均执行 (N-1)/2次。
所以循环体内的比较交换约执行 N * (N - 1) / 2 = (N^2 - N)/2(其中N^2是仿照Latex中的记法,表示N的平方)。按照计算复杂度的原则,去掉常数,去掉最高项系数,其复杂度为O(N^2)
其实留意观察,发现最后两次排序前后没有变化,但是多一次循环就多一定的性能开销,因此我们可以优化算法。
void bubble_sort_enhance( int *arr, int size){int i,j;for(i=0;i<size;i++){int sortedFlag = 1; for(j=i+1;j<size;j++){if(arr[j]>arr[i]){sortedFlag = 0;int temp = arr[i];arr[i] = arr[j];arr[j] = temp; }}if(sortedFlag){break;}}}
改进后的算法增加了一个sortedFlag的标识来判断是否已经排序完成,完成就不再继续循环。

2.选择排序

void select_sort( int *arr, int size){int i,j,min,temp,n;for(i=0;i<size;i++){min = arr[i];n = i;for(j=i+1;j<size;j++){if(min>arr[j]){min = arr[j];n = j;//最小数的下标 }}if(n!=i){temp = arr[i];arr[i] = min;arr[n] = temp;}}}
第一次排序:2 5 6 4 7 3
第二次排序:2 3 6 4 7 5
第三次排序:2 3 4 6 7 5
第四次排序:2 3 4 5 7 6
第五次排序:2 3 4 5 6 7
第六次排序:2 3 4 5 6 7
时间复杂度分析。其外层循环执行 N 次。内层循环最多的时候执行N-1次,最少的时候执行0次,平均执行 (N-1)/2次。
所以循环体内的比较交换约执行 N * (N - 1) / 2 = (N^2 - N)/2(其中N^2是仿照Latex中的记法,表示N的平方)。按照计算复杂度的原则,去掉常数,去掉最高项系数,其复杂度为O(N^2)

1 0
原创粉丝点击