企业级应用用到哪种排序?
根据不同情况,做出选择,在实际应用时用的方法比较灵活、简单;
当没有要求时,随便哪种都行;当有要求时,根据要求选择合适的排序方法。
目录
题目:将 3,2,6,8,1,9,4,5,7,0 这十个数存进数组,并从小到大排序,并体现排序过程
1.冒泡排序
//将 3,2,6,8,1,9,4,5,7,0 这十个数存进数组,并从小到大排序,并体现排序过程
//冒泡排序法
#include<stdio.h>
#define n 10 //n:数组长度
int main()
{
int a[n] = {3,2,6,8,1,9,4,5,7,0};
int i,j;
int temp; //交换两数的中间变量
for(i=0; i<n-1; i++) //n个数比较n-1趟
{
for(j=0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
for(int i=0; i<n; i++) //输出排序后的元素值
{
printf("%-4d",a[i]); //0 1 2 3 4 5 6 7 8 9
}
putchar('\n');
}
}
2 3 6 1 8 4 5 7 0 9
2 3 1 6 4 5 7 0 8 9
2 1 3 4 5 6 0 7 8 9
1 2 3 4 5 0 6 7 8 9
1 2 3 4 0 5 6 7 8 9
1 2 3 0 4 5 6 7 8 9
1 2 0 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
2.选择排序法
//将 3,2,6,8,1,9,4,5,7,0 这十个数存进数组,并从小到大排序,并体现排序过程
//选择排序法
#include<stdio.h>
#define n 10 //n:数组长度
int main()
{
int a[n] = {3,2,6,8,1,9,4,5,7,0};
int i,j,min; //min:每趟排序得出来的最小值
int temp; // 交换两数的中间变量
for(i=0; i<n-1; i++) //n个数比较n-1趟
{
min = i;
for(j=i+1; j<n; j++)
{
if(a[j] < a[min])
{
min = j;
}
}
if(i!=min)
{
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
for(int i=0; i<n; i++) //输出排序后的元素值
{
printf("%-4d",a[i]);
}
putchar('\n');
}
return 0;
}
0 2 6 8 1 9 4 5 7 3
0 1 6 8 2 9 4 5 7 3
0 1 2 8 6 9 4 5 7 3
0 1 2 3 6 9 4 5 7 8
0 1 2 3 4 9 6 5 7 8
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9
3.简单排序法
//将 3,2,6,8,1,9,4,5,7,0 这十个数存进数组,并从小到大排序,并体现排序过程
//简单排序法
#include<stdio.h>
#define n 10 //n:数组长度
int main()
{
int a[n] = {3,2,6,8,1,9,4,5,7,0};
int i,j;
int temp; //交换两数的中间变量
for(i=0; i<n-1; i++) //n个数,共比较n-1趟
{
for(j=i+1; j<n; j++)
{
if(a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
for(int i=0; i<n; i++)
{
printf("%-4d",a[i]);
}
putchar('\n');
}
}
0 3 6 8 2 9 4 5 7 1
0 1 6 8 3 9 4 5 7 2
0 1 2 8 6 9 4 5 7 3
0 1 2 3 8 9 6 5 7 4
0 1 2 3 4 9 8 6 7 5
0 1 2 3 4 5 9 8 7 6
0 1 2 3 4 5 6 9 8 7
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9
4.插入排序
//将 3,2,6,8,1,9,4,5,7,0 这十个数存进数组,并从小到大排序,并体现排序过程
//插入排序法
#include<stdio.h>
#define N 10
int main()
{
int i,j,temp;
int a[N] = { 3,2,6,8,1,9,4,5,7,0};
for(i=1; i<N; i++)
{
temp = a[i];
for(j=i-1; j>=0 && a[j]>temp; j--)
{
a[j+1] = a[j];
}
a[j+1] = temp;
for(int i =0; i<N; i++) //局部变量复习
{
printf("%-4d",a[i]);
}
putchar('\n');
}
}
2 3 6 8 1 9 4 5 7 0
2 3 6 8 1 9 4 5 7 0
2 3 6 8 1 9 4 5 7 0
1 2 3 6 8 9 4 5 7 0
1 2 3 6 8 9 4 5 7 0
1 2 3 4 6 8 9 5 7 0
1 2 3 4 5 6 8 9 7 0
1 2 3 4 5 6 7 8 9 0
0 1 2 3 4 5 6 7 8 9
5.三个数字排序
#include<stdio.h>
void fun(int *a ,int *b)
{
int t;
if(*a>*b)
{
t = *a;*a = *b;*b = t;
}
}
int main()
{
int a=5,b=3,c=4;
fun(&a,&b); fun(&a,&c); fun(&b,&c);
printf("%d%d%d",a,b,c); //345
}
6.归并排序
//归并排序
#include <stdio.h>
#include <stdlib.h>
#define N 9
void print(int arr[],int n){
for(int i=0 ;i<n; i++){
printf("%d ",arr[i]);
}
putchar('\n');
}
void merge(int arr[],int tempArr[],int left,int mid,int right){
int l_pos = left; //标记左半球 第一个未排序的元素
int r_pos = mid+1; //标记右半球 第一个未排序的元素
int pos = left; //临时数组元素下标
while(l_pos <= mid && r_pos <= right){ //如果左半球有元素、右边区也有元素
if(arr[l_pos] < arr[r_pos]){ //左半区没排序的第一个元素 < 右没排第一
tempArr[pos++] = arr[l_pos++]; //把这个小的放到临时数组里
} else{
tempArr[pos++] = arr[r_pos++];
}
}
while(l_pos <= mid){ //合并左半球剩余元素
tempArr[pos++] = arr[l_pos++];
}
while(r_pos <= right){ //合并右半球剩余元素
tempArr[pos++] = arr[r_pos++];
}
while(left <= right){ //把临时数组中合并的元素复制回原来的数组
arr[left] = tempArr[left];
left++;
}
}
void msort(int arr[],int tempArr[],int left,int right){
//如果不止一个数,就劈开
if(left < right){ //递归的过程
int mid = (left + right) / 2;
msort(arr,tempArr,left,mid); //递
msort(arr,tempArr,mid+1,right); //递
merge(arr,tempArr,left,mid,right); //归 合并
//合并 需要用到 arr左边数组,左边的下标,中间分割,右边的下标
}
}
void merge_Sort(int arr[],int n){ //归并排序入口
//划分
int *tempArr = (int *)malloc(sizeof(int) * n);
if(tempArr){
msort(arr,tempArr,0,n-1); //真正的归并排序过程
free(tempArr); //释放
}else{
printf("分配内存失败");
}
}
int main(){
int a[N] = {9,5,2,7,12,4,3,1,11};
print(a,N);
merge_Sort(a,N);
print(a,N);
return 0;
}
9 5 2 7 12 4 3 1 11
1 2 3 4 5 7 9 11 12