``选择排序、插入排序``
在书上看了这两种排序解释后,确定动手写一下,最后还是完成了,跟大家分享一下吧:1) 选择排序:
程序代码:[color=#0000FF]#include<stdio.h> void sort(int *, int); // 选择排序的函数(升序): // 从左到右参数依次为:需要排序的数组、数组大小 void display(int *, int); // 显示一个数组中所有元素的函数: // 从左到右参数依次为:需要显示的数组、数组大小 void swap(int *, int *); // 交换两个int指针对应值的函数: // 从左到右参数依次为:int指针、int指针 int main(int argc, char *argv[]) { int arr[] = { -11, 7, 2, 47, 7, 88, 23, 49, 49, -123, -32768 }; // 乱写的一些整数 display(arr, sizeof(arr) / sizeof(int)); // 先看看没有排序前的样子 sort(arr, sizeof(arr) / sizeof(int)); // 调用排序函数 display(arr, sizeof(arr) / sizeof(int)); // 再看看排序后的样子 return 0; } void sort(int * arr, int size) { int i, j, k; for(i = 0; i < size - 1; i++) { // 从第一个元素开始与剩下的元素比较 k = i; // 记录下开始i的值 for(j = i + 1; j < size; j++) { // 遍历剩下的元素 if(arr[k] > arr[j]) { // 如果k对应的值不是最小的 k = j; // 记录下比k还小值的索引 } } if(k != i) { // 如果k != i则说明找到比i对应值还小的,且是剩于元素中最小的 swap(arr + k, arr + i); // 交换k 和 i对应元素的值 } } } /* 下面的就懒得写注释了 */ void display(int * arr, int size) { int i; for(i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } void swap(int * p1, int * p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } 运行结果:
2)插入排序:
程序代码:#include <stdio.h>
#include <stdlib.h>
void sort2(int *, int); // 插入排序的函数(升序):
// 从左到右参数依次为:需要排序的数组、数组大小
void display(int *, int); // 显示一个数组中所有元素的函数:
// 从左到右参数依次为:需要显示的数组、数组大小
void copy(int *, const int *, int); // 将一个数组复制到另一个数组中的函数:
// 从左到右参数依次为:容纳复制数据的数组、源数组、复制的个数
int main(int argc, char * argv[]) {
int arr[] = { -22, 22, 47, 99, 47, 50, 88, -99, 235, -32768 }; // 乱写的一些整数
display(arr, sizeof(arr) / sizeof(int)); // 先看看没有排序前的样子
sort2(arr, sizeof(arr) / sizeof(int)); // 调用排序函数
display(arr, sizeof(arr) / sizeof(int)); // 再看看排序后的样子
return 0;
}
void sort2(int * arr, int size) {
int * temp = (int *)calloc(size, sizeof(int)); // 这段空间存放插入元素的数组
int i, j, k, index;
for(i = 0; i < size; i++) { // 遍历整个数组
index = -1; // 没有找到插入位置,也就是说每次假设当前待插入元素是最大的,它将被置于最后
if(i == 0) { // 如果插入数组中还没有元素:则先把第一个当前待插入元素放在插入数组中的第一个位置
temp[i] = arr[i];
} else if(i == 1) { // 如果插入数组中只有一个元素:
if(arr[i] > temp[0]) { // 如果当前待插入元素大于插入数组中第一个元素,则在最后加上它即可
temp[i] = arr[i];
} else { // 小于插入数组中第一个元素,则插入数组中第一个元素索引加1,当前待插入元素放在第一个位置
temp[i] = temp[0];
temp[0] = arr[i];
}
} else { // 插入数组中已有2个以上的元素
for(j = 0; j < i - 1; j++) {
if(j == 0) { // 先与temp中第一个比较,看看它是否是最小的:
if(arr[i] < temp[j]) { // 如果当前待插入元素是最小的,插入位置为0
index = 0;
}
}
if(arr[i] >= temp[j] && arr[i] < temp[j + 1]) { // 如果当前待插入元素的值介于插入数组中两个相邻元素值之间,
index = j + 1; // 则插入位置为插入数组中两个相邻元素值大元素的索引,这里为j + 1
}
}
if(index == -1) { // 如果当前待插入元素是最大的,在最后加上它即可
temp[i] = arr[i];
} else {
for(k = i; k > index; k--) { // 在插入位置之后插入数组中的所有元素索引加1
temp[k] = temp[k - 1];
}
temp[index] = arr[i]; // 在index这个位置插入当前待插入元素
}
}
}
copy(arr, temp, size); // 已完成排序的数组复制到源数组中
free(temp); // ...
}
/* 下面的就懒得写注释了 */
void display(int * arr, int size) {
int i;
for(i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void copy(int * arr1, const int * arr2, int size) {
int i;
for(i = 0; i < size; i++) {
arr1[i] = arr2[i];
}
}
运行结果:
写完后觉得选择排序适用于数组,而插入排序则适用于链表,觉得不错就顶一下吧![/color]








