排序 (插入排序,快速排序,希尔排序)数据结构与算法分析-C语言描述
2017-08-08 21:43
423 查看
排序学习笔记
插入排序:
所谓的直接插入排序,是在一个已经排好序的序列里面再插入一个数据,看看他是应该插入到什么地方。insertionSort(int *arr, int left, int right) { int Len = right - left+1; int tmp,j; for (int i = left; i <= right; i++) { tmp = *(arr + i); for (j = i; j > 0 && tmp < *(arr + j - 1); j--) //如果这个新插入的数据很小,那么从就j开始逐渐往前取代,最终能够找到合适的位置。 *(arr + j) = *(arr + j - 1); *(arr + j) = tmp; //在多次--后的j处放上tmp。 } }
快速排序,这个快速排序是我自己写的:
#define Cutoff 3 //主要考虑到pivot的选择算法导致在小组中元素个数少于3个时,只能使用插入排序。 void insertionSort(int *arr, int left, int right) { int Len = right - left+1; int tmp,j; for (int i = left; i <= right; i++) { tmp = *(arr + i); for (j = i; j > 0 && tmp < *(arr + j - 1); j--) *(arr + j) = *(arr + j - 1); *(arr + j) = tmp; } } int media3(int *arr, int left, int right) //得到中位数,用来做为pivote,三个数据分别来自于数组的左端,中位数,和最右端,并且程序将这三个数进行了排序。 { int center = (left + right) / 2; if (*(arr + left) > *(arr + center)) swap(*(arr + left), *(arr + center)); if (*(arr + left) > *(arr + right)) swap(*(arr + left), *(arr + right)); if (*(arr + center) > *(arr + right)) swap(*(arr + center), *(arr + right)); swap(*(arr + center), *(arr + right)); return *(arr + right); } void Qsort(int *arr, int left, int right) //快速排序的主函数。 { if (left + Cutoff <= right) //判断是否需要采用插入排序 { int pivot = media3(arr, left, right); cout << pivot << endl; int i = left, j = right - 1; for (;;) { while (*(arr + ++i) < pivot); //快速找到比pivot大的位置 while (*(arr + --j) > pivot); //快速找到比pivot小的位置 if (i < j) swap(*(arr + i), *(arr + j));//交换这i ,j两个位置 else break; } for (int i = 0; i <= 9; i++) //测试使用的 { cout << *(arr + i) << " "; } cout << endl; swap(*(arr + i), *(arr + right)); //交换i和pivot的位置。 for (int i = 0; i <= 9; i++) //测试使用的 { cout << *(arr + i) << " "; } cout << endl; Qsort(arr, left, i - 1); //继续递归Qsort() Qsort(arr, i + 1, right); } else insertionSort( arr, left, right); //使用直接插入函数 } int main() { int arr[] = { 8,1,4,9,16,3,5,22,7,23 }; Qsort(arr, 0, 9); for (int i = 0; i <= 9; i++) { cout << *(arr + i) << " "; } return 0; }
测试结果:
相关文章推荐
- C语言常用的排序方法:冒泡排序,插入排序,快速排序,堆排序,希尔排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 快速排序,归并排序,堆排序,基数排序,插入排序,希尔排序,
- C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- C语言自带快速排序对比插入排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
- c语言排序之冒泡排序,选择排序,插入排序,快速排序总结
- c语言中的几种排序算法——冒泡排序、快速排序、插入排序、选择排序
- C语言中快速排序和插入排序优化的实现
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 快速排序 && 希尔排序 && 插入排序
- 各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 排序算法合集(插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序)