数据结构--算法时间复杂度
一列数字的排序有两种方式,一种是冒泡排序,一种是选择排序
冒泡排序BubbleSort原则:12先比较,然后23比较,然后34比较....(不管是否两两交换),因此比较的次数是:数列长度-1,这就是外层循环,比了第一轮后,,如果是8,7,2,1。。。呢(这是最糟糕的情况),第一轮交换只能是比较三次,交换3次,得到7,2,1,8,所以还得进行第二轮比较,依旧是两两比较,但做多少次呢?我们看到即使是最大值在第一个位置,做第一轮比较和交换的时候就可以把这个最大值放到他应该在的位置,因此在第二轮比较时就不需要再对整个序列进行比较了,只用比较整个序列长度-1-1次,那么第n次呢??思考一下,这就是内层循环退出的条件~
选择排序法SelectionSort原则:1跟234。。。。比较(不管是否两两交换),因此比较的次数是:数列长度-1,这就是外层循环,比了第一轮后,肯定有一个最小值把他置于第一个位置,然后开始第二轮比较,比较的次数不用再带上第一个位置,因此,比较的起点是第二个位置,因此j=i+1,比较的次数变成序列长度-1-1次,那么第n次呢??思考一下,这就是内层循环退出的条件~
#include <iostream> #include <cassert> using namespace std; void BubbleSort(int *arr,int len);//冒泡排序 void SelectionSort(int *arr,int len);//选择排序 int main() { static int a[6]={7,9,56,2,5,0}; int len = sizeof (a)/sizeof (int); // BubbleSort(a,len); // for(int i=0;i<len;i++) // { // printf("%d,",*(a+i)); // } SelectionSort(a,len); for(int i=0;i<len;i++) { printf("%d,",*(a+i)); } } void BubbleSort(int *arr,int len) { //检测输入参数 assert(arr!=NULL); //判断一轮检测是否有交换 bool change = true; //有交换才继续排序 for(int i= 0; i < len-1 && change;i++)//int i= len-1; i > 1 && change; --i { change = false; for(int j=0;j<len-1-i; j++) { if(arr[j] > arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; change = true; } } } } //选择排序 void SelectionSort(int *arr,int len) { //输入参数检测 assert(arr!=NULL); //最小值所在值的下标 int min = 0; //len个数,只需要进行len-1次选取就可以了,最后一个就是最大的值 for(int i = 0; i < len - 1; ++i) { //第i个最小值下标 min = i; //选取最小值的下标(前面i个数据已经排好序了) for(int j = i + 1; j < len ; ++j) { if(arr[j] < arr[min]) { //记录最小值的下标 min = j; } } //交换最小值到位置i if(min != i) { int temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } }
浙公网安备 33010602011771号