冒泡排序每一趟排序把最大的放在最右边。
比如:
87 12 56 45 78
87和12交换:12 87 56 45 78
87和56交换: 56 87 45 78
87和45交换: 45 87 78
87和78交换: 78 87
到此第一趟排序结束,接下来的每一趟排序都是这样。
#include<stdio.h>void Print(int *num, int n)
{
int i
for(i = 0 i < n i++)
printf("%d ", num[i])
puts("\n")
return
}
void Bubble_Sort(int *num, int n)
{
int i, j
for(i = 0 i < n i++)
{
for(j = 0 i + j < n - 1 j++)
{
if(num[j] > num[j + 1])
{
int temp = num[j]
num[j] = num[j + 1]
num[j + 1] = temp
}
Print(num, n)
}
}
return
}
int main()
{
int num[8] = {87, 12, 56, 45, 78}
Bubble_Sort(num, 5)
return 0
}
冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`arr[n],arr[n+1]`),如果前面的数大于后面的数(`arr[n] >arr[n+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置(arr[n-1])。
C语言实现Bubblesort:
void bubblesort(int a[], int m){
int i,j
int tmp
int flag = 0 //设定标志,如果第一次循环比较时没有发生交换,则说明数组是升序排序,不用排序,提前结束循环。
for(i = 0 i < m i++) //外层循环控制循环次数
{
for(j = 0 j < m-1-i j++) //内层循环控制每次循环里比较的次数。
{
if(a[j] > a[j+1])
{
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
flag = 1
}
}
if(0 == flag)
{
printf("No Sort\n")
break
}
}
}
选择排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下标)。
C语言实现(Selectionsort)
void selectionsort(int a[],int m){
int i,j
int k
int tmp
for(i = 0 i < m-1 i++)//控制循环次数,n个数需要n-1次循环
{
k = i
for(j = i+1 j < m j++)
{
if(a[j] < a[k])
k = j
}
//i不等于k是就证明a[i]不是最小的,
//i等于k时证明a[i]就是本轮比较过程中最小的值
if(i != k)
{
tmp = a[i]
a[i] = a[k]
a[k] = tmp
}
}
}
#include "stdio.h"int main()
{
int a[10]
int i, j, temp
// 输入10个整型数据
printf("Please input ten numbers: \n")
for (i = 0 i < 10 i++)
scanf("%d", &a[i])
// 排序
for (i = 0 i < 9 i++) // 10个数,10 - 1轮冒泡,每一轮都将当前最大的数推到最后
{
for (j = 0 j < 9 - i j++) // 9 - i,意思是每当经过一轮冒泡后,就减少一次比较
if (a[j] > a[j+1])
{
temp = a[j]
a[j] = a[j+1]
a[j+1] = temp
}
//在这也显示一下排序的过程
for (j = 0 j < 10 j++)
printf(" %d ", a[j])
printf("\n")
}
// 打印排序结果
for (i = 0 i < 10 i++)
printf(" %d ", a[i])
return 0
}