用到的一个检验 就是说 如果已经排序好了 就不用走那么多趟了,在while循环里有个if
如果满足条件就把flag设为真,则不跳出,如果没有执行就跳出这个循环,现在只不过是这个if外面多了一个for循环
实质是一样的。
#include<iostream>
using namespace std;
int main(){
int i=1;
bool flag;
while(i<8){
flag = false;
i++;
//之前做都是直接在while里有个if如果满足某个条件就改变flag值现在只不过是多了for而已
for (int j=0;j<8-i+1;j++){
if( ){
//做一些事情
flag=true;
}
}//内部for
//检验是否还有交换然后跳出while循环
if(!flag) break;
}
return 0;
}
#include<iostream>
using namespace std;
void insert_sort(int a[], int n);
int main()
{
int a[]= { 3,7,2,9,6,5,8,1,4};
insert_sort(a,9);
system("pause");
return 0;
}
void insert_sort(int a[], int n)
{
int i=1, j, temp;
bool flag;
while(i<n)
{
i++;
//@3@ 每一趟都会把flag为false 如果交换了 就设为true,跑完一趟末尾检验是否跳出
//while 循环 ,当排序好了之后呢由于没有交换则flag为假就跳出了。
flag = false;
/* @1@
//j的范围本来应该是从数组下标为零到n-i-1所以j<(n-i)
//但这次用的是while循环i已经长了个1 所以改成 j<(n-i+1)
*/
for(j=0; j<(n-i+1); j++)
{
/* @2@
//最后报错是因为不恰当的跳出循环
//本来是想每一趟循环只有没有交换的时候才跳出
//但是把flag = false;
写入下面之后每个数比较都要重新设置flag
那么如果最后几个比较的数没有移动就会引起跳出了,所以如果
后面的顺序排好了,就会减少几趟排序,那么前面可能没有排好的也跳出来了
*/
//flag = false;
if(a[j]>a[j+1])
{
//如果交换了数据令flag为真
flag = true;
temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
/*
@4@ 这一段主要是打印每一趟的排序结果来查看到底是哪次排序出错了
cout<<i-1<<"趟:";
for (int k = 0; k < n; ++k){
cout<<a[k]<<" ";
}
cout<<endl<<"----"<<endl;
*/
if(!flag) break;
}
for (i = 0; i < n; ++i)
{
cout<<a[i]<<" ";
}
}//insert