冒泡排序
版本1:
void bubbleSort(int arr[],int n)
{
bool swapped; //标记每次是否有进行交换,如果没有进行交换,说明已经有序了
do{
swapped=false;
for(int i=0;i<n-1;i++)
{
if(arr[i]>arr[i+1])
{
swap(arr[i],arr[i+1]);
swapped=true;
}
}
//每一趟都将最大的元素放在了最后的位置,所以下一次排序,最后的元素可以不再考虑
n--;
}while(swapped);
return;
}
版本2:
void bubbleSort2(int arr[],int n)
{
int newn;
do{
newn=0;
for(int i=1;i<n;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr[i],arr[i-1]);
//记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
newn=i;
}
}
n=newn; //更新n的值
}while(n>0);
return ;
}
希尔排序
版本1:
void shellSort(int arr[],int n)
{
int d=n/2; //每隔d的元素分成一组,现在就是分成两组,d越来越小,分成的组数越来越多,最后分成n组
while(d>=1)
{
for(int i=d;i<n;i++)
{
//对arr[i],arr[i-d],arr[i-2*d],arr[i-3*d]...使用插入排序
int temp=arr[i]; //当前的元素
int j;
for(j=i;j>=d && temp<arr[j-d];j-=d) //当前元素和相距为d的元素进行比较
{
arr[j]=arr[j-d];
}
arr[j]=temp;
}
d=d/2;
}
return;
}