排序经常需要用到交换函数,其代码为:
//交换函数
void swap(int* a,int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
1、冒泡排序
//冒泡排序
void bubble_sort(int arr[],int length)
{
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j < length-i-1; j++)
{
if (arr[j]>arr[j+1]) //升序
{
swap(&arr[j],&arr[j+1]);
}
}
}
}
2、选择排序
//选择排序
void select_sort(int arr[],int length)
{
int min=0;
for (int i = 0; i < length; i++)
{
int min=i;
for (int j = i+1; j < length; j++)
{
if (arr[j]<arr[i])
{
min=j;
}
}
if (min !=i)
{
swap(&arr[i],&arr[min]);
}
}
}
3、插入排序
//插入排序
void insert_sort(int arr[],int length) //升序
{
int j;
for (int i = 1; i < length; i++)
{
if (arr[i]<arr[i-1]) //比升序序列最大值要小
{
int temp=arr[i];
for (j = i-1; j >=0; j--)
{
if (temp<arr[j]) //升序序列中元素大于arr[i]
{
arr[j+1]=arr[j]; //向前移动一位
}
else
{
break;
}
}
arr[j+1]=temp;
}
}
}
4、希尔排序
//希尔排序
void shell_sort(int arr[],int length)//升序
{
int increasement=length;
int i,j,k;
do
{
increasement=increasement/3+1; //确定分组增量
for ( i = 0; i < increasement; i++)
{
for (j = i+increasement; j < length; j+=increasement)
{
if (arr[j]<arr[j-increasement])
{
int temp=arr[j];
for (k =j-increasement ; k >= 0; k-=increasement)
{
if (arr[k]>temp)
{
arr[k+increasement]=arr[k];
}
else
{
break;
}
}
arr[k+increasement]=temp;
}
}
}
} while (increasement>1);
}
5、快速排序
//快速排序 升序
void quick_sort(int arr[],int start,int end)
{
int i=start;
int j=end;
int temp=arr[start];//基准数
if (i<j)
{
while (i<j)
{
//从右往左找比基准数小的
while (i<j && arr[j]>=temp)
{
j--;
}
//填坑
if (i<j)
{
arr[i]=arr[j];
i++;
}
//从左向右找比基准数大的数
while (i<j && arr[i]<temp)
{
i++;
}
//填坑
if (i<j)
{
arr[j]=arr[i];
j--;
}
}
//基准数放入i=j中
arr[i]=temp;
//对基准数左半部分快速排序
quick_sort(arr,start,i-1);
//对基准数右半部分快速排序
quick_sort(arr,j+1,end);
}
}