一、排序的定义:
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
例如:将下列关键字序列
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 }
的操作称作排序。
二、内部排序和外部排序
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
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;
}