#include <stdlib.h>
#include <stdio.h>
typedef int Item;
#define key(A) (A)
#define less(A, B) (key(A) < key(B))
#define exch(A, B) {Item t = A; A = B; B = t;}
#define compexch(A, B) if(less(B,A)) exch(A,B)
// 注意在宏函数这里实际是不做任何执行的,只是替换而已
void sort(Item a[], int l, int r){
int i;
int j;
for(i = l+1; i<=r; i++){
for(j=i; j>l; j--){
compexch(a[j-1], a[j]);
}
}
}
// 选择排序,每次都是找出最小的那个,原后和i互换
void selectSort(Item a[], int l, int r){
int i;
int j;
for(i = l; i <= r; i++){
int min = i;
for(j = i+1; j <= r; j++){
if(less(a[j], a[min])){
min = j;
}
}
compexch(a[i], a[min]);
}
}
// 插入排序
// 首先找出最小的那个排到第一个
// 然后从第三个开始,倒序的和前面的一个个比较,小就把被比较的元素往往后罗一位,大就停止
// 最后把比较的那个元素插入到空缺的那个位置
// 这个和选择排序的区别是除了找出最小元素外,每次并不是找出最小的元素,只是保证处理过的数据是从小到大的顺序就可以了
void insertSort(Item a[], int l, int r){
int i;
for(i = r; i>0; i--){
compexch(a[i-1], a[i]);
}
for(i=l+2; i<=r; i++){
int j = i;
Item v = a[i];
while(less(v, a[j-1])){
a[j] = a[j-1];
j--;
}
a[j] = v;
}
}
// 冒泡排序
// 每次比较、互换相邻的两个,把最小的换到最前面
// 注意这个和选择排序的区别,它是在找出最小元素的每一个比较的同时都可能互换
// 选择排序则是最后一步才互换
void bubbleSort(Item a[], int l, int r){
int i;
int j;
for(i=0; i<r; i++){
for(j=r; j>i; j--){
compexch(a[j-1], a[j]);
}
}
}
void main(int argc, char* argv[]){
int i;
int N = atoi(argv[1]);
int* a = malloc(N*sizeof(int));
for(i=0; i<N; i++){
a[i] = rand()%1000;
printf("%d ", a[i]);
}
printf("\n");
//sort(a, 0, N-1);
//selectSort(a, 0, N-1);
//insertSort(a, 0, N-1);
bubbleSort(a, 0, N-1);
for(i=0; i<N; i++){
printf("%d ", a[i]);
}
printf("\n");
}
算法c语言实现 6-2至6-4 3种基本排序
最新推荐文章于 2020-11-30 21:08:13 发布