冒泡排序优化
1、冒泡排序从头到尾的扫描,冒泡排序每一次扫描是把前边未排好序的项中最大的项移到后面 。O :n * n的2开方。
优化1:若前边的项是有序的,方案1依然会做无谓的扫描。可以设置一个boolean的标志位,若上一次进行了交换才进入下一轮扫描。
优化2:若排序中有一段是有序的,也不需要重复的扫描。可以把最后一次交换的位置提出来,下次扫描把这个位置作为最大的扫描位置。
//优化2的实现 int bubble(vector<int>* vector1,int lo,int hi){ int last= 0; while(++lo<hi){ if((*vector1)[lo] < (*vector1)[lo-1]){ int temp = (*vector1)[lo]; (*vector1)[lo] = (*vector1)[lo-1]; (*vector1)[lo-1] = temp; last = lo; } } return last; } int main() { vector<int> vector1(10); vector1[0] = 0; vector1[1] = 42; vector1[2] = 26; vector1[3] = 53; vector1[4] = 44; vector1[5] = 93; vector1[6] = 62; vector1[7] = 38; vector1[8] = 82; vector1[9] = 92; int m = vector1.size(); int lo = 0; while (0< (m = bubble(&vector1,lo,m))){ } for (int i = 0; i < vector1.size(); ++i) { printf("第%d个元素是%d\n",i,vector1[i]); } return 0; }