1.冒泡排序
现有数组a[10],每次循环时都从元素a[9]开始,将a[j]与a[j-1]作比较,如果a[j]小,则将a[j]前移,继续与前面的值两两比较,会将最小值移到数组最前面。
外循环n-1次(n为数组长度),每次内循环都是从尾部开始,用a[j]与a[j-1]两两做比较,小值不断前移。
时间复杂度O(n**2)
代码:
#include <stdio.h>
void BubbleSort(int k[], int n)
{
int i, j, temp, count1=0, count2=0;
for( i=0; i < n-1; i++ )
{
for( j=n-1; j > i; j-- )
{
count1++;
if( k[j-1] > k[j] )
{
count2++;
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}
int main()
{
int i;
int a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
BubbleSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}
2.选择排序
外循环n-1次,每次都将a[i]作为最小值,内循环时每次都会从第[i:n-1]的元素中找到最小值,先记录最小值下标,等一次内循环执行完后,再将最小值和a[i]交换位置。
时间复杂度:O(n**2),但是移动次数会比冒泡少
代码:
#include <stdio.h>
void SelectSort(int k[], int n)
{
int i, j, min, temp, count1=0, count2=0;
for( i=0; i < n-1; i++ )
{
min = i;
for( j=i+1; j < n; j++ )
{
count1++;
if( k[j] < k[min] )
{
min = j;
}
}
if( min != i )
{
count2++;
temp = k[min];
k[min] = k[i];
k[i] = temp;
}
}
printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}
int main()
{
int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
SelectSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}
3.直接插入排序
将数组分为有序区和无序区,初始阶段假设第一个元素是已经排好序的,每次循环时将无序区中的第一个元素按照大小插入到有序区。
时间复杂度:O(n**2)
#include <stdio.h>
void InsertSort(int k[], int n)
{
int i, j, temp;
for( i=1; i < n; i++ )
{
if( k[i] < k[i-1] )
{
temp = k[i];
for( j=i-1; k[j] > temp && j> = 0; j-- )
{
k[j+1] = k[j];
}
k[j+1] = temp;
}
}
}
int main()
{
int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
InsertSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}