1.直接插入排序
//直接插入排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
void insertsort(int a[], int n)
{
int i, j, tmp;
for (i = 1; i < n; i++)
{
tmp = a[i]; //记录下当前要插入的元素
j = i - 1;
while (j>=0 && tmp < a[j])
{
a[j + 1] = a[j]; //若当前要插入的元素比它前面的第j个元素小,则将第j个元素向前移动一个位置
j--;
}
a[j + 1] = tmp;//当判断到最后一个元素或者遇见第一个比tmp小的元素时,跳出循环,将tmp插入到j的下一个位置
}
}
int main()
{
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i;
int n = sizeof(a) / sizeof(a[0]);
printf("排序之前:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
insertsort(a, n);//调用排序函数
printf("\n排序之后:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}
2.选择排序
//选择排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
void selectsort(int a[], int n)
{
int i, j;
int min;
int tmp;
for (i = 0; i < n-1; i++)
{
min = i; //选出第i趟比较中的最小元素的下标,先假设最小元素的小标为i
for (j = i + 1; j < n; j++)
{
if (a[min]>a[j])
min = j;
}
if (min != i) //若最小元素的下标改变了,则交换元素,将最小元素放到第i个位置
{
tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
}
int main()
{
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i;
int n = sizeof(a) / sizeof(a[0]);
printf("排序之前:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
selectsort(a, n);//调用排序函数
printf("\n排序之后:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}
3.冒泡排序
//冒泡排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
void bubblesort(int a[], int n)
{
int i, j;
int tmp;
for (i = 0; i < n - 1; i++) //共进行n-1趟比较
{
for (j = 0; j< n - 1 - i; j++) //第i躺比较要进行n-1-i次两两比较
{
if (a[j]>a[j + 1])
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
int main()
{
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i;
int n = sizeof(a) / sizeof(a[0]);
printf("排序之前:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
bubblesort(a, n);//调用排序函数
printf("\n排序之后:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}
4.希尔排序
//希尔排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
void shellsort(int a[], int n)
{
int i, j;
int tmp;
int gap = n;//记录划分的大小
int flag;
while (gap >= 1)
{
gap = gap / 2;
do
{
flag = 0;
for (i = 0; i < n - gap; i++)
{
j = i + gap;
if (a[i]>a[j])
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
flag = 1;
}
}
} while (flag == 1);
}
}
int main()
{
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0};
int i;
int n = sizeof(a) / sizeof(a[0]);
printf("排序之前:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
shellsort(a, n);//调用排序函数
printf("\n排序之后:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}
5.快速排序
//快速排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void quicksort(int a[], int low, int high)
{
int i, j;
if (low < high)
{
i = low;
j = high + 1;
while(1)
{
do
i++;
while (!(a[low]<=a[i] || i == high));//从左找到比基准元素a[low]大的第一个数
do
j--;
while (!(a[low] >= a[j] || j == low));//从右找到比基准元素a[low]小的第一个数
if (i < j)
swap(&a[i], &a[j]);
else
break;
}
swap(&a[low], &a[j]); //j<=i,交换a[low]和a[j]后,基准元素左边的数都不大于基准元素,右边的数都不小于基准元素
quicksort(a, low, j - 1); //递归排序基准元素前面的子序列
quicksort(a, j + 1, high); //递归排序基准元素后面的子序列
}
}
int main()
{
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i;
int n = sizeof(a) / sizeof(a[0]);
printf("排序之前:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
quicksort(a,0,n-1);//调用排序函数
printf("\n排序之后:");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}