对三种简单排序法(冒泡,选择,快速)及二分法查找进行总结分析:
一、排序法
算法 | 冒泡排序 | 选择排序 | 快速排序 |
时间复杂度 | O(n²) | O(n²) | O(n log n ) |
冒泡排序(BubbleSort)基本思想:依次比较相邻的两个数,将小数排在前面,大数放在后面。
void BubbleSort(int *a,int n ) { for(int i = 0;i<n-1;i++) { for(int j = 0;j<n-1-i;j++) { if(a[j]>a[j+1]) { int t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
选择排序基本思想:每一趟从待排序的数列中找出最小的,放在排好序的数列的最后。
void SelectionSort(int *a,int n ) { for(int i = 0;i<n-1;i++) { for(int j = i + 1;j<n;j++) { if(a[i]>a[j]) { int t = a[j]; a[j] = a[i]; a[i] = t; } } } }
快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后对这两部分再进行快速排序(递归调用)。
void qsort(int *a,int start,int end) { if(start >= end) return; //停止递归 int i = start; int j = end; int key = a[i]; //基准位 while(i<j) { while(i<j&&a[j]>=key) { j--; } a[i] = a[j]; while(i<j&&a[i]<=key) { i++; } a[j] = a[i]; } a[i] = key; //或者a[j] = key; qsort(a,start,i-1); //递归调用,对左右两边进行快排 qsort(a,i+1,end); }
根据时间复杂度,冒泡&选择排序适用于小列表,快速排序适用于大列表。
一般来说,选择排序优于冒泡排序(效率高约7倍)。
但若数组完全有序,冒泡内循环一次都不会执行(可检测整个数组是否已经有序),而选择排序每次还要和本身交换一次,此时冒泡效率高。(此情况极少)
二、二分查找
string search(int a[],int num) { int low = 0; int high = sizeof(a)-1; while(low <= high) { int mid = (low + high)/2; int guess = a[mid]; if(guess == num ) { return "找到了"; } if(guess > num) { high = mid - 1; }else{ low = mid +1; } } return "没有找到"; }
时间复杂度O(log n)
注意:所查找的元素列表必须有序
扫描二维码关注公众号,回复:
188035 查看本文章