一维数组
1.选择排序
(1)n个数经过n-1轮排序;
(2)从剩下的所有数中选择一个更小的数;
(3)验证该位置是否与i相等,如果不相等,交换;
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]>a[j]
k=j;
}
//交换
if(i!=k)
{
//i位置和k位置的数值做交换;
}
2.冒泡排序(o(n^2),稳定性排序)
冒泡法排序指的是在排序时,每次比较数组中相邻的两个数组元素的值,将较大的数(从小到大排列)排在较小的数后面。
(1)n个数n-1轮冒泡
for(i=0;i<n-1;i++)
{
int flag=1;
for(j=0;j<n-1-i;j++)
{
//相邻两个元素两两比较;
if(a[j]>a[j+1])
{
//交换;
flag=0;
}
}
if(flag)
break;
}
#include<stdio.h>
int main()
{
int arr[10]; /*定义一个数组*/
int i,j; /*i,j为将要使用的循环控制变量*/
int temp; /*temp为数值交换时使用的临时变量*/
for(i=0;i<=9;i++) /*输入10个数*/
{
scanf("%d",&arr[i]);
}
for(i=1;i<=10-1;i++) /*i代表排序轮数,总轮数=元素个数-1*/
{
for(j=0;j<10-i;j++) /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
{
if(arr[j]>arr[j+1]) /*如果前一项比后一项大,则两项的值互换*/
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<=9;i++) /*输出排序后的数组*/
{
printf("%d ",arr[i]);
}
return 0;
}
插入排序
插入排序:也称直接插入排序。基本思路:每一步将一个数插入一个已经排好的序列中,并使之保持有序。直到插完所有的数为止。
第一种:找到位置的插入
外层循环要经过n-1轮;
//插入排序(从小到大)
#include<stdio.h>
#include<stdlib.h>
int number[100000000]; //定义数组
void insertion_sort(int *number,int n) //定义一个插入函数"insertion_sort"
{
int i,t,temp;
for(i=1;i<n;i++) //外层循环遍历 (需要插入n个数)
{
temp=number[i]; //取未排序列的元素,有n个,从第一个开始取
for(t=i;t>0&&number[t-1]>temp;t--);
{
number[t]=number[t-1];//依次比较并右移
number[t]=temp;//放进合适位置
}
}
}
int main()
{
int i=0,n,j=0;
printf("输入数字个数:\n");
scanf("%d",&n); //输入要排序的数字的个数
printf("输入%d个数:\n",n);
for(j=0;j<n;j++) //将所有数全放入number数组中
scanf("%d",&number[j]) ;
insertion_sort(number,n); //引用插入函数
for(i=0;i<n-1;i++) //循环输出
printf("%d ",number[i]); //格式需要
printf("%d\n",number[i]);
system("pause");
return 0;
}
第二种:交换式插入
for(i=1;i<n;i++)
{
for(j=i;j>1;j--)
{
if(a[j]<a[j-1])
{
int t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
else
break;
}
}