排序算法是我们日常的开发中是使用最频繁的算法,在这里自己简单总结下。
我们接触最早的排序算法是在C语言这门课中冒泡排序(bubble sort)、选择排序(select sort)和插入排序(insert sort),它们的时间复杂度都为O(n^2)。至于算法逻辑我这里就不说,大家都知道。
用C++的template实现这两个简单排序算法,实现代码如下:
bubble sort && select sort
/* FileName: main.cpp Author: ACb0y Create Time: */ #include <iostream> using namespace std; typedef char * str; /* 函数名: template<class type> void swap(type * pl, type * pr); 功能: 交换两个变量的值 参数: pl (in): type * :左参数 pr (in): type * :右参数 返回值:无 */ template<class type> void swap(type * pl, type * pr) { type tmp = *pl; *pl = *pr; *pr = tmp; } /* 函数名: template<class type> void bubble_sort(type * data, int n, bool cmp(const type & lv, const type & rv)); 功能: 对data里面的n个元素进行排序(冒泡排序) 参数: data (in): type *: 要排序序列的头指针 n (in): int: 序列中元素的个数 cmp (in): bool (const type &, const type &): 比较函数指针 返回值:无 */ template<class type> void bubble_sort(type * data, int n, bool cmp(const type & lv, const type & rv)) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n - i - 1; ++j) { if (cmp(data[j], data[j + 1])) { swap(data + j, data + j + 1); } } } } /* 函数名: template<class type> void bubble_sort(type * data, int n, bool cmp(const type & lv, const type & rv)); 功能: 对data里面的n个元素进行排序(冒泡排序) 参数: data (in): type *: 要排序序列的头指针 n (in): int: 序列中元素的个数 cmp (in): bool (const type &, const type &): 比较函数指针 返回值:无 */ template<class type> void select_sort(type * data, int n, bool cmp(const type & lv, const type & rv)) { int pos; type tmp; for (int i = 0; i < n - 1; ++i) { pos = i; tmp = data[i]; for (int j = i + 1; j < n; ++j) { if (cmp(tmp, data[j])) { pos = j; tmp = data[j]; } } swap(&data[i], &data[pos]); } } /* 函数名: template<class type> void print(type * data, int n, char * format); 功能: 输出存储在data序列中的n个元素 参数: data (in): type *: 要排序序列的头指针 n (in): int: 序列中元素的个数 format (in): char *: 输出格式 返回值:无 */ template<class type> void print(type * data, int n, char * format) { for (int i = 0; i < n; ++i) { printf(format, data[i]); } printf("/n"); } bool cmp_int(const int & lv, const int & rv) { return lv > rv; } bool cmp_str(const str & lv, const str & lr) { if (strcmp(lv, lr) < 0) { return false; } return true; } int main() { int data[10] = {10, 3, 34, 53, 234, 23, 5, 56, 123, 100}; printf("排序前:"); print(data, 10, "%d "); select_sort(data, 10, cmp_int); printf("排序后:"); print(data, 10, "%d "); str strData[5] = {"class", "component", "package", "demo", "interface"}; printf("排序前:"); print(strData, 5, "%s "); bubble_sort(strData, 5, cmp_str); printf("排序后:"); print(strData, 5, "%s "); return 0; }
运行结果如下:
insert sort
/* FileName: insertSort.cpp Author: ACb0y Create Time: 2011年2月14日9:47:52 Last modify Time: 2011年2月14日10:11:19 */ #include <iostream> using namespace std; /* 函数名: template<class type> void insertSort(type * data, int n, bool cmp(const type & lv, const type & rv)); 功能:插入排序 参数: data (in): type *: 元素序列的头指针 n (in): int: 元素序列的个数 cmp (in): bool (const type &, const type &): 元素比较函数谓词 返回值:无 */ template<class type> void insertSort(type * data, int n, bool cmp(const type & lv, const type & rv)) { for (int i = 0; i < n; ++i) { int pos = i; for (int j = i - 1; j >= 0; --j) { if (cmp(data[j], data[i])) { pos = j; } } if (pos == i) { continue; } int tmp = data[i]; for (int j = i - 1; j >= pos; --j) { data[j + 1] = data[j]; } data[pos] = tmp; } } /* 函数名: template<class type> void print(type * data, int n, char * format); 功能:按照指定格式输出指向元素序列中的n各元素 参数: data (in): type *: 元素序列头指针 n (in): int: 序列中元素的个数 format (in): char *: 输出格式 返回值:无 */ template<class type> void print(type * data, int n, char * format) { for (int i = 0; i < n; ++i) { printf(format, data[i]); } printf("/n"); } /* 函数名: bool cmp_int(const int & lv, const int & rv); 功能: 整型元素比较的函数谓词 参数: lv (in): const int: 左值 rv (in): const int: 右值 返回值: false: lv < rv true: lv >= rv */ bool cmp_int(const int & lv, const int & rv) { if (lv < rv) { return false; } return true; } int main() { int data[10] = {23, 34, 83, 73, 63, 64, 2, 73, 345, 234}; insertSort(data, 10, cmp_int); print(data, 10, "%d "); return 0; }
运行结果截图如下: