标签:
直观的视频http://www.cnblogs.com/wangfupeng1988/archive/2011/12/26/2302216.html
1,冒泡排序
——冒泡,每一次最大的值升到最后面,像水泡升到了水面,冒出来了,不再位于水里,不再需要比较,它已经确定了,独立了。
每次从最前面开始比较相邻的两个数,如果前面的大于后面的则交换,直到末尾最后两个,结束后末尾为最大的数。
除去已经找到的最大数,继续从最前开始,两相邻数比较,直到此次数值序列的末尾。
重复以上过程,直到最后一次只有两个数值需要比较。
//the first circle , from 0,1 to ,count-2,cout-1 //the last circle, at 0,1
对每一次的数值序列,记录其是否发生了交换,如果没有,则不需要再进行下一次的循环。
void exchange(uchar * a, uchar *b) { uchar temp; temp = *a; *a = *b; *b = temp; } void sort (uchar a[], uchar Count) { uchar i,j; bool change = 0; if(a == NULL || Count <=0 ) return; //the first circle , from 0-1 to ,count-2,cout-1 //the last circle, at 0-1 for(j = Count-1; j>= 1,change != 0; j-- ) //set the end posittion { change = 0; for(i = 0; i <= j-1; i++ ) { if(a[i] > a[j]) { exchange( &a[i], &a[j]); change = 1; } } } }
2,插入排序
--和冒泡排序逻辑伤相反,冒泡是一次找一个最大值,是个体优先,插入呢,是保证我的序列始终是整齐的,每次放入一个数值到我的序列中。
第一次整齐的序列只有1个数,把相邻的下一个数与这个数相比较,放入合适的位置
下一次,对于排好的序列,再加入下一个数,从序列末尾开始向前依次进行比较,遇到比它大得则交换,遇到比它小的,停止这一次的比较。
重复以上过程,直到最后一次插入最后一个数。
//first circle 1,0
//last circle n-1,n-2, to max, n-1,0
//想到初中时的推理证明题,证明无穷大的情况,从1开始证明, 然后证明n时成立,推导出无穷大时成立。
void sortInsert (uchar a[], uchar n) { uchar i,j; //first circle 1,0 //last circle n-1,n-2, to max, 1,0 for(j = 1; j<= n-1; j++) { for(i = j-1; i >= 0; i--) { if(a[i] > a[i+1]) exchange(&a[i], &a[i+1]); else break; } } }
3,
标签:
原文地址:http://www.cnblogs.com/aprilapril/p/4288816.html