排序(2)——插入/希尔/选择/快速排序及优化
来源:互联网 发布:张子萱怀孕时淘宝照片 编辑:程序博客网 时间:2024/06/13 23:37
"Sort.h"
<strong><span style="font-size:18px;">#pragma once#include <iostream>using namespace std;#include <assert.h>#include <stack>void InsertSort(int* arr,size_t size)//直接插入排序{assert(arr);for (int i = 1;i < size;i++){int j = i-1;int tmp = arr[i];while (arr[j] > tmp && j >= 0){arr[j + 1] = arr[j];j--;}arr[j+1] = tmp;}}void SellSort(int* arr,size_t size)//希尔排序{assert(arr);int k = size;while (k > 1){k = k / 3 + 1;for (int i = k; i < size;i ++){int tmp = arr[i];int j = i - k;while (arr[j] > tmp && j >= 0){arr[j + k] = arr[j];j -= k;}arr[j + k] = tmp;}}}void SelectSort(int* arr,size_t size)//选择排序{assert(arr);for (int i = 0;i < size;i++){int min = i;for (int j = i+1;j < size;j++){if (arr[j] < arr[min]){min = j;}}//arr[i] = arr[min];//注意,这里是交换,不是赋值,很容易在这一步写错,写错了程序就会出现大错误swap(arr[i],arr[min]);}}void SelectSort_OP(int* arr,size_t size)//选择排序的优化{assert(arr);int left = 0;int right = size - 1;while (left < right){int MinIndex = left;int MaxIndex = right;for (int i = left;i <= right;i++){if (arr[i] < arr[MinIndex]){MinIndex = i;}if (arr[i] > arr[MaxIndex]){MaxIndex = i;}}swap(arr[left],arr[MinIndex]);if (MaxIndex == left)//处理当数组出现9 1 2 3 4 0的情况{MaxIndex = MinIndex;}swap(arr[right],arr[MaxIndex]);left++;right--;}}int PartSort(int* arr,int left,int right)//快速排序{assert(arr);int k = arr[right];int begin = left;int end = right;while (begin < end){while (begin < end && arr[begin] <= k)//左边找大{begin++;}while (begin < end && arr[end] >= k)//右边找小{end--;}if (begin < end){swap(arr[begin],arr[end]);}}swap(arr[begin],arr[right]);return begin;}void QuickSort(int* arr,int left,int right)//快速排序(递归实现){assert(arr);if (left >= right){return;}int div = PartSort(arr,left,right);QuickSort(arr,left,div-1);QuickSort(arr,div+1,right);}void QuickSort_NonR(int* arr,int left,int right)//快速排序(非递归实现){assert(arr);stack<int> _stack;_stack.push(right);_stack.push(left);while (_stack.empty() == false){int begin = _stack.top();_stack.pop();int end = _stack.top();_stack.pop();int div = PartSort(arr,begin,end);if (begin < div-1){_stack.push(div-1);_stack.push(begin);}if (div+1 < end){_stack.push(end);_stack.push(div+1);}}}</span></strong>
test.cpp
<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1#include "Sort.h"void test1()//InsertSort{int arr[] = {1,4,3,8,2,9,8,4,6};int size = sizeof(arr)/sizeof(arr[0]);InsertSort(arr,size);for (int i = 0;i < size;i++){cout<<arr[i]<<" ";}cout<<endl;}void test2()//SellSort{int arr[] = {6,7,8,9,0,1,2,6,4,5};int size = sizeof(arr)/sizeof(arr[0]);SellSort(arr,size);for (int i = 0;i < size;i++){cout<<arr[i]<<" ";}cout<<endl;}void test3()//SelectSort{int arr[] = {6,5,1,7,2,9,1,4,6};//int arr[] = {6,5,1,7,2,9,3,4,8};int size = sizeof(arr)/sizeof(arr[0]);//SelectSort(arr,size);SelectSort_OP(arr,size);for (int i = 0;i < size;i++){cout<<arr[i]<<" ";}cout<<endl;}void test4()//QuickSort QuickSort_NonR{int arr[] = {1,4,3,8,2,2,8,2,6};//int arr[] = {4,1};int size = sizeof(arr)/sizeof(arr[0]);//QuickSort(arr,0,8);//QuickSort(arr,0,1);QuickSort_NonR(arr,0,8);for (int i = 0;i < size;i++){cout<<arr[i]<<" ";}cout<<endl;}int main(){//test1();//test2();//test3();test4();system("pause");return 0;}</span></strong>
1 0
- 排序(2)——插入/希尔/选择/快速排序及优化
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 小白学数据结构——四、排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)
- 常见排序方法(冒泡排序、选择排序、插入排序、希尔排序和快速排序)
- 挖掘算法中的数据结构(一):O(n^2)排序算法之 选择、插入、冒泡、希尔排序 及 优化
- 常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 算法 —— 选择排序,插入排序,希尔排序
- 直接插入 选择 快速 希尔排序 总结
- java插入,希尔,快速,冒泡,选择排序
- 插入 | 希尔 | 冒泡 | 快速 | 选择 | 归并排序
- 插入排序,选择,冒泡,快速排序算法及优化
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 排序总结JS版(冒泡排序、简单选择排序、快速插入排序、希尔排序、堆排序、快速排序)
- C语言常用排序——直接插入,冒泡,选择,希尔,快速,堆排序
- 字符串排序算法(冒泡、选择、插入、希尔、快速)
- 常用的排序算法性能分析(1)—— 选择排序、插入排序、希尔排序
- 排序算法Java描述:选择、冒泡、插入、希尔、归并、快速及三向切分快速排序
- python 找出序列中出现次数最多的元素方法。
- 关于Fragment你所需知道的一切
- Java Web 中replace与replaceAll的区别
- 用Matlab来恢复PNG透明度
- 快速多人游戏(2) - 客户端预测和服务器校验
- 排序(2)——插入/希尔/选择/快速排序及优化
- ucosIII内核文件分析-os_core.c
- 上传本地代码到GitHub
- python BIF /操作符 / If else / assert
- window putty 生成公钥私钥 用于git 或者 ssh 等
- 调试器的原理-详解ptrace函数及fork父子进程跟踪实例
- 快速多人游戏(3) - Entity插值
- 深究angularJS——(上传)FileUploader中文翻译
- java 发送邮件