排序

冒泡排序

img

算法步骤

  • 从开始第一对到结尾的最后一对,比较相邻的元素,如果第一个>第二个则交换。
  • 一轮结束后最大的数会排到最后,然后排除最大/最后的数接着冒泡前面的数,例二轮会把最大(第二大)的数排到最后

e.g.

1 3 5 7 9 2 4 6 8 10

第一轮

(1)1 3 5 7 2 9 4 6 8 10  #9>2
(2)1 3 5 7 2 4 9 6 8 10  #9>4
(3)1 3 5 7 2 4 6 9 8 10  #9>6
(4)1 3 5 7 2 4 6 8 9 10  #9>8
(5)1 3 5 7 2 4 6 8 9 10  #9<10  第二轮以此类推知道排成1 2 3 4 5 6 7 8 9 10为止

基本代码

#include<stdio.h>//基本代码
int main(){
	int n,a[1000];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);

	for(int i=0;i<n;i++){
		for(int j=0;j<n-i-1;j++){
			if(a[j]>a[j+1]){
				int t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
            }
		}
	}

	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0;
} 

优化代码

#include <stdio.h>//优化代码
int main(){
    int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
    int i, j, temp, isSorted;
   
    //优化算法:最多进行 n-1 轮比较
    for(i=0; i<10-1; i++){
        isSorted = 1;  //假设剩下的元素已经排序好了
        for(j=0; j<10-1-i; j++){
            if(nums[j] > nums[j+1]){
                temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
                isSorted = 0;  //一旦需要交换数组元素,就说明剩下的元素没有排序好
            }
        }
        if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了
    }

    for(i=0; i<10; i++){
        printf("%d ", nums[i]);
    }
    printf("\n");
   
    return 0;
}

字符串冒泡

#include <stdio.h>
#include <string.h>
int main()
{
	int n=0,i=0;
	char a[100][100];

	while(scanf("%s",&a[i])!=EOF)i++;

	for(int j=0;j<i-1;j++){
		for(int k=0;k<i-j-1;k++){
			if(strcmp(a[k],a[k+1])>0){
				char t[100];
				strcpy(t,a[k]);
				strcpy(a[k],a[k+1]);
				strcpy(a[k+1],t);
			}
		}	
	}
	
	for(int j=0;j<i;j++)
		printf("%s",a[j]);
	return 0;
}

快速排序

步骤

  • 从数组中选一个元素作为基准数
  • 分区,比基准数大的放右边,小的放左边
  • 再对两边重复分区
#include<stdio.h>

void quicksort(int *a,int low,int high);
int main()
{
    int arr[12];
    for(int k=0;k<10;k++)
        scanf("%d",&arr[k]);

	quicksort(arr,0,9);

	for(int k=0;k<10;k++)
        printf("%d ",arr[k]);

    return 0;
}
void quicksort(int *a,int low,int high){
	if(low<high){
		int i=low;
		int j=high;
		int num=a[i];
	
		while(i<j){
			while(i<j&&a[j]>=num)j--;
			if(i<j)
				a[i++]=a[j];
		
			while(i<j&&a[i]<num)i++;
			if(i<j)
				a[j--]=a[i];
		}
		a[i]=num;//i==j
	
		//递归
		quicksort(a,low,i-1);//排左边
		quicksort(a,i+1,high);//排右边
		
		return;
	}
}

参考:快速排序 | 菜鸟教程 (runoob.com)

选择排序

归并排序

插入排序

posted @ 2022-07-16 12:00  HeadmasterEggy  阅读(33)  评论(0)    收藏  举报