-代码分享-
插入排序
void lnsertionSort(int a[], int n)
{
int end = 0;
int tmp = 0;
int i = 0;
for (i = 0;i < n - 1; i++)
{
end = i;
tmp = a[end + 1];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
end–;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
希尔排序
void ShellSort(int a[], int n)
{
//gap是间隔(增量)
int gap = n;
while (gap > 1)
{
gap /= 2;//间隔(增量)每次循环都缩小一半
//end表示 每一组 有序序列最末尾的元素的下标
int end = 0;
//tmp表示 每一组 无序序列的第一个元素的下标
int tmp = 0;
int i = 0;
//把插入排序中的1都换成gap
for (i = 0; i < n - gap; i++)
{
end = i;
tmp = a[end + gap];
while (end >= 0)//end
{
//如果前gap个元素大于后gap个,就让前gap个向后移gap位
//给后gap个可插入的空隙
if (a[end] > tmp)
{
a[end + gap] = a[end];
end-=gap;
}
else
{ //因为是从已经有序的序列的末尾向前插入
//所以前一个之前的元素都比它小,所以不用再比较,直接结束循环
break;
}
}
//插入空出的空隙
a[end + gap] = tmp;
}
}
}
冒泡排序
void bubbleSort(int a[], int n)
{
int i = 0;
int j = 0;
int flag = 0;
//总共需要n趟冒泡排序
for (i = 0; i < n; i++)
{
//重置flag的值
flag = 0;
//一趟冒泡排序,排出一个最大值
for (j = 0; j < n - i - 1; j++)
{
if (a[j] > a[j + 1])
{
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
//只要一趟冒泡排序发生了交换,就还没排序完成
flag = 1;
}
}
//如果一趟冒泡排序之后,flag还是0,
//就说明没有交换,已经有序
if (flag == 0)
break;
}
}
交换函数
void Swap(int* p, int* q)
{
int tmp = *p;
*p = *q;
*q = tmp;
}
选择排序
void SelectSort(int a[], int n)
{
//count表示有序序列末尾的下标
int count= 0;
int i = 0;
//min为最小值的下标
int min = 0;
while(count<n)
{
//每一趟选择排序都从有序数列末尾开始找最小值
min = count;
for (i = count; i<n;i++)
{
if (a[min] > a[i])
min = i;
}
//Swap为交换函数
Swap(&a[count], &a[min]);
//每一趟选择排序之后有序数列末尾下标加一
count++;
}
}