数组下标 0 1 2 3 4 5
初始数据 55 33 88 66 22 77
第一趟 完 33 55 66 22 77 88
第二趟 完 33 55 22 66 77 88
第三趟 完 33 22 55 66 77 88
第四趟 完 22 33 55 66 77 88
第五趟 完 22 33 55 66 77 88
此数组有6个元素 需要比5趟 (定义变量 j 记录趟数,变量len表示数组元素个数) for(j=0;j<len-1;j++)
每一趟的代码如下(变量i表示每一趟比较的次数)
for(i=0;i;i++)
{
if(arr[i]>arr[i+1])
{
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
但是每一趟比完后都可以确定一个元素的位置,即:
第一趟需要比5次
第二趟需要比4次
第三趟需要比3次
第四趟需要比2次
第五趟需要比1次
优化后代码为:
for(i=0;i<len-1-j;i++)
{
if(arr[i]>arr[i+1])
{
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
完整代码如下:
#include<stdio.h>
void swap(int *p,int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
void fun(int *a,int n)
{
int k = n;
for(int i=1;i<k;i++)
{
if(a[i-1]>a[i])
{
swap(&a[i-1],&a[i]);
}
}
k--;
}
void main()
{
int arr[]={2,5,8,1,3,4};
int len=sizeof(arr)/sizeof(arr[0]);
fun(arr,len);
for(int i=0;i<len;i++)
{
printf("%d",arr[i]);
}
}
若初始序列中有一部分已经有序 这个时候我们就不用重复的进行判断交换
优化后的代码如下
#include<stdio.h>
void swap(int *p,int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
void fun(int *a,int n)
{
bool flag = true;
int k = n;
while(flag)
{
flag = false;
for(int i=1;i<k;i++)
{
if(a[i-1]>a[i])
{
swap(&a[i-1],&a[i]);
flag = true;
}
}
k--;
}
}
void main()
{
int arr[]={5,6,7,8,1,2,3};
int len=sizeof(arr)/sizeof(arr[0]);
fun(arr,len);
for(int i=0;i<len;i++)
{
printf("%d",arr[i]);
}
}