一.冒泡排序:
1.算法:
1>.基本思想:在排序过程中对元素进行两两比较,越小的元素会经由交换慢慢‘’浮‘’到数组的最前面(低下标处),像气泡一样慢慢浮起。
2>.本质:
第1趟冒泡:从数组n-1下标的元素到0下标元素遍历,比较相邻元素对,如果后一个元素小于前一个元素,则交换。第一趟结束时,最小元素‘’浮起‘’到达0下标位置。第二趟冒泡:从数组n-1下标的元素到1下标元素遍历(因为0下标的已经是最小元素,已经到位,无需再参加比较),比较相邻元素对,如果后一个元素小于前一个元素,则交换。第二趟结束时,本趟最小元素到达1下标位置。以此类推,最多n-1趟冒泡,便可完成排序。
3>.代码实现如下:
#include<stdio.h>
#define SIZE 10
void print(int a[],int n)
{
int i;
printf("The array is:\n");
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}
void BubbleSort(int a[],int n)
{
int i,j, temp;
for(i=0;i<n-1;i++) //共进行n-1趟排序
for(j=n-1;j>i;j--) //递减循环,从后往前比较
if(a[j]<a[j-1]) //两两比较,若后一个元素小则交换该组相邻元素
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
int main()
{
int array[SIZE],i=0,n;
do //保证读入的数n满足1<=n<=SIZE
{
printf("Please input n(1<=n<=%d):",SIZE);
scanf("%d",&n);
}while(n<1||n>SIZE);
printf("Please input %d elements:\n",n);
for(i=0;i<n;i++)
scanf("%d",&array[i]); //读入数组元素
BubbleSort(array,n); //调用函数完成排序
print(array,n);
return 0;
}
//用指针方法对10个整数按由大到小顺序排序。用冒泡法进行排序
二.选择法排序:
1.算法:
1>.本质:不断查找最大(小)元素的过程。
第一次:n个元素中最小的和第一个元素对换。第二次:n-1个元素中最小的和第二个元素对换。······.第n-1次:最后两个元素比较,小的放到第n-1个元素的位置上
2>.基本思想:把数组分为左右两个半区,左半区为有序子集,右半区为n-1趟选择。每一趟选择都在无序子集(右半区)中选择出最小元素,并与无序子集首元素交换,然后将该元素并入有序子集。共进行n-1趟排序,每趟最多交换一次。
3>.数据结构:数组,嵌套循环,记录本次查找最小值下标的变量,交换的中间变量
4>.代码实现如下:
#include<stdio.h>
void Input(int *pa,int n)
{
int i;
printf("Plaese input %d elements:\n",n);
for(i=0;i<n;i++) //用for语句控制输入个元素
scanf("%d",pa+i); //还可以用&pa[i]代替pa+i
}
void sort(int *pa,int n)
{
int index,i,k,temp;
for(k=0;k<n-1;k++) //k控制排序的趟数,以0到n-2表示所有趟
{
index=k; //本趟最小位置存于index,开始时为K
for(i=k+1;i<n;i++) //通过内层循环找出本趟真正的最小元素
{
if(pa[i]<pa[index]) //将本趟最小元素的下标赋给index
index=i;
}
if(index!=k) //如果本趟最小元素没有到位
{
temp=pa[index]; //则通过交换使本趟最小元素到K下标处
pa[index]=pa[k];
pa[k]=temp;
}
}
}
void Output(const int *pa,int n)
{
int i;
for(i=0;i<n;i++)
printf("%5d",*(pa+i));
printf("\n");
}
int main()
{
int a[10],n; //定义数组,n控制元素个数
do //保证读入的n满足1<=n<=10
{
printf("Please input n(1<=n<=10):\n");
scanf("%d",&n);
}while(n<1||n>10);
Input(a,n); //调用函数,完成输入
printf("The original array is:\n");
Output(a,n); //调用函数,输出原始数组
sort(a,n); //调用函数,完成排序
printf("The sorted array is:\n");
Output(a,n); //调用函数,输出排序后的数组
return 0;
}
//用指针方法对10个整数按由大到小顺序排序。用选择法进行排序