小伙伴们下面讲的是一些使用数组时,常用到的一些基本的数组排序方法
1.数组交换排序法
这种方法是将数组中元素进行比较,从而通过temp进行交换数值,达到排序的一种方法。
接下来的一段代码可以很通俗易懂的表达出数组排序法的用法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int score[5],temp,i,j;
for(i=0;i<5;i++)
{
scanf("%d",&score[i]);
}
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
if(score[j]>score[i])
{
temp=score[j];
score[j]=score[i];
score[i]=temp;
}
}
printf("%d ",score[i]);
}
return 0;
}
2.数组冒泡排序法
这种方法其实和上一种方法差不多,但冒泡与交换不同的在于他的循环条件和它排序的方式。
8 | 5 | 4 | 2 | 0 |
5 | 4 | 2 | 0 | 2 |
4 | 2 | 0 | 4 | 4 |
2 | 0 | 5 | 5 | 5 |
0 | 8 | 8 | 8 | 8 |
9 | 9 | 9 | 9 | 9 |
看下面一个列题:有十个地区的面积,要求对它们按由小到大的顺序排列
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10];
int i,j,t;
printf("input 10 numbers: \n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
} printf("\n");
for(j=0;j<9;j++)//进行9次循环,实现9次比较。
{
for(i=0;i<9-j;i++)//在每趟中进行9-i次比较
{
if(a[i]>a[i+1])//相邻两个数比较
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
printf("the sorted numbers:\n");
for(i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
3.选择排序法
选择排序法跟其他方法不同的是它排序的方法是记录最大值的下标,依次进行比较大小交换下标值,从而达到排序。
代码段如下:
void datasort(int score[],long num,int n)
{ int i,j,k,temp1;
long temp2;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(score[j]>score[k])//成绩降序排序;num[j]>num[k]学号升序排序。
{
k=j;/*记录最大数下标位置*/
}
}
if(k!=i)/*若最大数不在下标位置i*/
{
temp1=score[k];
score[k]=score[i];
score[i]=temp1;
temp2=num[k];
num[k]=num[i];
num[i]=temp2;
}
}
}
4.插入排序法
它的工作原理为将待排列元素划分为“已排序”和“未排序”两部分,每次从“未排序的”元素中选择一个插入到“已排序的”元素中的正确位置。
c++
// C++ Version
void insertion_sort(int* a, int n) {
// 对 a[1],a[2],...,a[n] 进行插入排序
for (int i = 2; i <= n; ++i) {
int key = a[i];
int j = i - 1;
while (j > 0 && a[j] > key) {
a[j + 1] = a[j];
--j;
}
a[j + 1] = key;
}
}
python
# Python Version
def insertion_sort(a, n):
for i in range(2, n + 1):
key = a[i]
j = i - 1
while j > 0 and a[j] > key:
a[j + 1] = a[j]
j = j - 1
a[j + 1] = key
c
//在一个已按升序排列的数组中插入一个数,插入后,数组元素仍按升序排列,
//已知升序数组{1, 2, 4, 6, 8, 9, 12, 15, 149, 156 }。
//输入:直接输入一个整数,没有其它任何附加字符。
//输出:输出插入元素后的升序数列,每个数输出占5列。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[11]={1,2,4,6,8,9,12,15,149,156};
int i,j,temp;
scanf("%d",&temp);
for(i=0;i<10;i++)
{
if(temp<a[i])
break;
}
for(j=9;j>=i;j--)
{
a[j+1]=a[j];
}
a[i]=temp;
for(i=0;i<11;i++)
{
printf("%d ",a[i]);
}printf("\n");
return 0;
}