一.插入排序还是堆排序?????
二.选择排序
1.思想:在未排序的序列中选出最小的元素,将其与序列的首位元素交换,接下来再在剩下的未排序的序列中选出最小的元素,将其与序列的第二位元素交换。
2.实现
3.小知识点:
a)一维数组、二维数组的函数传递
调用函数时都只用写函数名!
但在函数的参数声明时,二维数组必须写出列数。(原因:C语言里面对二维数组的存储是按照一维数组来处理的,二维数组按照行展开的方式按顺序存储)
void foo(int *a ,int n)
{
...
}
int main()
{
int a[3]={0,1,2};
foo(a , n);//只写函数名就行了
}
void foo(int a[][3] , int m , int n)
{
...
}
int main()
{
int a[2][3] = {
{1,2,3},
{4,5,6}
};
foo(a, 2, 3);//也只用写函数名
}
4.代码
#include <stdio.h>
#define swap(a,b) a^=b;b^=a;a^=b
void print(int *a,int i,int n)
{
int j;
static int flag=1;
if(i==n-1){
printf("sorted array: ");
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
}
else{
printf("step %d: ",flag++);
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
printf("\n");
}
}
void sort(int *a,int n)
{ int min=0;
int i,j;
for(i=0;i<n;i++){
min=i;
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
}
if(a[i] > a[min]){
swap(a[i],a[min]);
}
print(a,i,n);
}
}
int main()
{
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,n);
return 0;
}
三.冒泡排序
1.思想:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。(通过一遍扫描,则最后一个元素必定是最大的元素。)
然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
2.实现
注意:N-i-1(N-i指处理前面的那些元素,最后那个减1是防止j+1溢出)
若不减1:i=0,j=N-0的时候a[j+1]=a[N]溢出了
3.代码
#include <stdio.h>
int main()
{
int i,j,t,N,K,a[111]={0};
scanf("%d %d",&N,&K);
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<K;i++){
for(j=0;j<N-i-1;j++){
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("%d",a[0]);
for(i=1;i<N;i++) printf(" %d",a[i]);
return 0;
}