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

1.冒泡排序

#include 
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;iarr[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;iarr[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;iarr[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)

你可能感兴趣的:(算法分析)