常见排序方法(未完待续~~~~)

一、排序的定义:
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
例如:将下列关键字序列
52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97
一般情况下,
假设含n个记录的序列为{ R1, R2, …,Rn }
其相应的关键字序列为 { K1, K2, …,Kn }
这些关键字相互之间可以进行比较,即在
它们之间存在着这样一个关系 :
  Kp1≤Kp2≤…≤Kpn
按此固有关系将上式记录序列重新排列为
{ Rp1, Rp2, …,Rpn }
的操作称作排序。
二、内部排序和外部排序
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。图片来源https://blog.csdn.net/weixin_38333555/article/details/80515605

1、插入排序*

一趟直接插入排序的基本思想:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1)直接插入法
利用“顺序查找”实现“在R[1…i-1]中查找R[i]的插入位置”
算法要点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体实例如下:
C语言实现:

#include <stdio.h>
void insertion_sorta(int arr[],int len);//函数声明
void insertion_sortb(int arr[], int len);
int main()
{	int i;//如果此i定义在for循环前面不符合C语言c89/90规范 把后缀改成cpp(c99规范)才能运行成功
	int arr[]={22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
	int len = (int) sizeof(arr) / sizeof(*arr);  //计算数组长度,也可以用循环计算
	insertion_sorta(arr,len); //调用函数
	printf("升序后:\n");
	for( i=0;i<len;i++)  //打印出排序后的数组
		printf("%d  ",arr[i]);
	printf("\n");
	insertion_sortb(arr,len);
	printf("降序后:\n");
	for( i=0;i<len;i++)  //打印出排序后的数组
		printf("%d  ",arr[i]);
	return 0;
}
//直接插入排序核心算法(升序)
void insertion_sorta(int arr[], int len){
    int i,j,temp;
    for (i=1;i<len;i++){  //从第二开始
            temp = arr[i];  //记录目标元素
            for (j=i;j>0 && arr[j-1]>temp;j--) //从右向左比较
                    arr[j] = arr[j-1];
            arr[j] = temp; 
    }
}
//直接插入排序核心算法(降序)也可以用升序后的数组逆输出  
void insertion_sortb(int arr[], int len){
    int i,j,temp;
    for (i=1;i<len;i++){  //从第二开始
            temp = arr[i];
            for (j=i;j>0 && arr[j-1]<temp;j--) //从右向左比较
                   arr[j]=arr[j-1];
            arr[j] = temp;
    }
}


2、交换排序

1)冒泡排序
在这里插入图片描述
在这里插入图片描述
实例如下
C语言实现:

#include <stdio.h>
void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}
int main() {
    int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    int i;
    for (i = 0; i < len; i++)
        printf("%d ", arr[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值