普通的冒泡排序:
void bubble_sort(int* arr,int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int t=0;
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
}
这时候我们再想,如果循环了几次后,数列已经有序了,但是在普通的冒泡算法下,还是要继续循环知道i=n-1,这会浪费很多的资源和时间,加一个判断数列有序的方法,如果数列有序就直接跳出冒泡算法呢?如果arr[j]恒>arr[j+1],则说明有序,那么就加入一个flag变量,代码如下:
void bubble_sort(int* arr,int n)
{
for(int i=0;i<n-1;i++)
{
int flag=1; //加入一个变量判断是否有序
for(int j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int t=0;
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
flag=0; //判断出现arr[j]>arr[j+1],so array unsort
}
}
if(flag==1) //有序就用break跳出循环
{
break;
}
}
}
普通选择排序
void choice_sort(int* arr,int n)
{
for(int i=0;i<n;i++)
{
int t=i;
for(int j=i+1;j<n;j++)
{
if(arr[t]>arr[j])
{
t=j;
}
}
if(t!=i)
{
int mid=0;
mid=arr[i];
arr[i]=arr[t];
arr[t]=mid;
}
}
}
优化后的选择排序,每次循环其实可以选着出max,和min两个数:
#include <stdio.h>
void swap(int* x,int* y )//这里可以注意指针的用法
{
int t=*x;
*x=*y;
*y=t;
}
void choice_sort(int* arr,int n)
{
int left=0;
int right=n-1;
while(left<right)
{
int max=right;//记录,循环一次后最小数的下标
int min=left;//记录,循环一次后最大数的下标
for(int i=left;i<=right;i++)//这里是因为每个数都得选择到所以i<=right
{
if(arr[min]>arr[i])
min=i;
if(arr[max]<arr[i])
max=i;
}
swap(&arr[min],&arr[left]);
if(max==left)//如果最大数刚好是arr【left】的话,经过一次交换,最大数变成了arr【min】
{
max=min;
}
swap(&arr[max],&arr[right]);
left++;
right--;
}
}
int main()
{
int arr[]={9,8,7,6,1,2,3,4,5,0};
int sn=sizeof(arr)/sizeof(arr[0]);
choice_sort(arr,sn);
for(int i=0;i<sn;i++)
{
printf("%d ",arr[i]);
}
}