各种排序算法学习整理 C++实现
来源:互联网 发布:什么是.net编程 编辑:程序博客网 时间:2024/06/05 11:46
感谢网上各位大神的讲解,参考了网上多位大神的博客,做出了这次整理。
排序算法中用到的函数:
void Swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}void PrintArray(int data[],int length){ for (int i = 0; i < length; i++) { cout << data[i] << " "; } cout << endl;}
1.冒泡排序
/*交换排序:冒泡排序*/void bubbleSort(int data[], int length){ if (data == nullptr || length <= 0) return; for (int i = 0; i < length - 1; i++) { for (int j = 0; j < length - i - 1; j++) { if (data[j]>data[j + 1]) Swap(&data[j], &data[j + 1]); } }}
2.快速排序
/*交换排序:快速排序*/int Partition(int data[], int length, int start, int end){ if (data == nullptr || length <= 0 || start < 0 || end >= length) throw new exception("invalid parameters!"); int index = start; int small = start - 1; for (index; index < end; index++) { if (data[index] < data[end]) { ++small; if (small != index) { Swap(&data[small], &data[index]); } } } ++small; Swap(&data[small], &data[end]); return small;}void QuickSort(int data[], int length, int start, int end){ if (start == end) return; int index = Partition(data, length, start, end); if (index > start) QuickSort(data, length, start, index - 1); if (index < end) QuickSort(data, length, index + 1, end);}
3.堆排序
/*选择排序:堆排序*/void HeapAdjust(int data[], int s, int length){ int tmp = data[s]; int child = s * 2 + 1; //这是当前节点的左孩子!!! while (child < length) { if (child + 1 < length&&data[child] < data[child + 1]) ++child; //要找到左右孩子中比较大的那个 if (data[s] < data[child]) { data[s] = data[child]; s = child; child = s * 2 + 1; } else break; data[s] = tmp; }}void BuildHeap(int data[], int length){ if (data == nullptr || length <= 0) return; for (int i = (length - 1) / 2; i >= 0; i--) //初始建堆是从下往上 { HeapAdjust(data, i, length); }}void HeapSort(int data[], int length){ BuildHeap(data, length); for (int i = length - 1; i > 0; --i) { Swap(&data[0], &data[i]); HeapAdjust(data, 0, i); }}
4.简单选择排序
/*选择排序:简单选择排序*/void SelectSort(int data[], int length){ if (data == nullptr || length <= 0) return; for (int i = 0; i < length - 1; i++) { int min = i; for (int j = i+1; j < length; j++) { if (data[min]>data[j]) { min = j; } } Swap(&data[min], &data[i]); }}
5.直接插入排序
/*插入排序:直接插入排序*/void InsertSort(int data[], int length){ for (int i = 1; i < length; i++) { if (data[i] < data[i - 1]) { int tmp = data[i]; int j = i-1; while (j >= 0 && data[j]>tmp) { data[j+1] = data[j]; j -= 1; } data[j + 1] = tmp; } }}
6.希尔排序
/*插入排序:希尔排序*/void ShellSort(int data[], int length){ int i, j, gap; for (gap = length / 2; gap > 0; gap /= 2) { for (i = 0; i < gap; i++) { //直接插入排序 for (j = i + gap; j < length; j += gap) { if (data[j] < data[j - gap]) { int tmp = data[j]; int k = j - gap; while (k >= 0 && data[k]>tmp) { data[k + gap] = data[k]; k -= gap; } data[k + gap] = tmp; } } } }}
7.归并排序
/*归并排序*/void MergeArray(int data[], int start, int mid, int end){ vector<int> tmp; int another_start = mid + 1; int i = start; int j = another_start; while (i <= mid&&j <= end) { if (data[i] < data[j]) { tmp.push_back(data[i++]); } else { tmp.push_back(data[j++]); } } while (i <= mid) { tmp.push_back(data[i++]); } while (j <= end) { tmp.push_back(data[j++]); } for (unsigned int i = 0; i < tmp.size(); i++) { data[start + i] = tmp[i]; }}void MergeSort(int data[], int start, int end){ if (data == nullptr || start < 0) throw new exception("invalid parameters!"); if (start < end) { int mid = (start + end) / 2; MergeSort(data, start, mid); MergeSort(data, mid + 1, end); MergeArray(data, start, mid, end); }}
测试
#include <iostream>#include <stdlib.h>#include <vector>using namespace std;int main(){ //int data[] = { 49, 38, 65, 97, 76, 13, 27, 49 }; int data[] = { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int length = sizeof(data) / sizeof(data[0]); bubbleSort(data, length); PrintArray(data,length); QuickSort(data, length, 0, length - 1); PrintArray(data, length); HeapSort(data, length); PrintArray(data, length); SelectSort(data, length); PrintArray(data, length); InsertSort(data, length); PrintArray(data, length); ShellSort(data, length); PrintArray(data, length); MergeSort(data, 0, length - 1); PrintArray(data,length); system("pause"); return 0;}
阅读全文
0 0
- 各种排序算法学习整理 C++实现
- 各种排序算法整理
- 各种排序算法的C实现
- 各种排序算法的C实现(转载)
- C语言实现各种排序算法
- java各种排序算法整理
- c语言实现各种排序算法(作业:点名册排序)
- 各种排序算法实现
- 各种排序算法实现
- 各种排序算法实现
- 算法学习----各种排序算法的实现和对比1
- 算法学习----各种排序算法的实现和对比2
- 经典算法学习:各种排序算法的模板类实现
- 常用的各种排序算法(C语言实现)
- 高效面试之各种排序算法c实现
- 各种基本的排序算法在Object-C实现
- C语言--数组实现--各种排序算法个人总结
- 各种排序算法 C语言版
- 3G模块SIM5360E实现拨号上网功能
- PHP中Header()的用法
- Batch Normalization
- 可作为GC Root的对象
- JAVA的异常处理浅析
- 各种排序算法学习整理 C++实现
- 正则学习
- Android Studio导入整个Android系统源码
- 配置本地X Server远程安装Oracle 数据库
- gcc编译不容易发现的错误
- ECharts使用从0到1 -- 以vue-echarts为例
- maven project 路径配置
- M
- 生产者消费者算法之多线程操作数据库速度提升