标签:style blog class code java c
1.排序的分类
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。
稳定的排序 | 时间复杂度 | 空间复杂度 |
冒泡排序 | 最差和平均是O(n2),最好是O(n) | 1 |
双向冒泡排序 | 最差和平均是O(n2),最好是O(n) | 1 |
插入排序 | 最差和平均是O(n2),最好是O(n) | 1 |
归并排序 | 最差、平均、最好都是O(nlogn) | O(n) |
桶排序 | O(n) | O(k) |
基数排序 | O(dn)(d是常数) | O(n) |
二叉树排序 | O(nlogn) | O(n) |
图书馆排序 | O(nlogn) |
(1+e)n |
不稳定的排序 | 时间复杂度 | 空间复杂度 |
选择排序 | 最差和平均是O(n2),最好是O(n) | 1 |
希尔排序 | O(nlogn) | 1 |
堆排序 | 最差、平均、最好都是O(nlogn) | 1 |
快速排序 | 平均O(nlogn),最差是O(n2) | O(nlogn) |
2.常见排序算法分析:
1.冒泡法
冒泡法就是第一个数开始,不断地和后面地数比较,大的数往后,一轮后最大的数跑到最后;为了使序列在正序列前提下,能减少排序的次数,需要用一个BOOL型变量来判断是否发生了交换
1 #include<iostream> 2 using namespace std; 3 4 5 void sort(int a[],int n) 6 { 7 int i,j,temp; 8 bool exchange; 9 for(i=0;i<n-1;i++) 10 { 11 exchange = false; 12 for(j=0;j<n-i-1;j++) 13 { 14 if(a[j+1]<a[j]) 15 { 16 temp = a[j+1]; 17 a[j+1] = a[j]; 18 a[j] = temp; 19 } 20 exchange = true; 21 } 22 if(!exchange) 23 return; 24 } 25 } 26 27 28 29 int main() 30 { 31 int a[] = {13,31,45,26,78,56,90,24,15,81}; 32 sort(a,10); 33 for(int i=0;i<10;i++) 34 cout<<a[i]<<‘ ‘; 35 cout<<endl; 36 return 0; 37 }
2.直接插入法
注意用while来实现寻找插入的位置,减少辅助变量
1 #include<iostream> 2 using namespace std; 3 4 5 void sort(int a[],int n) 6 { 7 int i,j; 8 for(i=1;i<=n-1;i++) 9 { 10 j = i-1; 11 int temp = a[i]; 12 while(temp<a[j]) 13 { 14 a[j+1]=a[j]; 15 j--; 16 } 17 a[++j]=temp; 18 } 19 } 20 21 22 23 int main() 24 { 25 int a[] = {13,31,45,26,78,56,90,24,15,81}; 26 sort(a,10); 27 for(int i=0;i<10;i++) 28 cout<<a[i]<<‘ ‘; 29 cout<<endl; 30 return 0; 31 }
标签:style blog class code java c
原文地址:http://www.cnblogs.com/mhohcc/p/3726259.html