快速排序、归并排序的递归、非递归实现
2018-01-13 12:01
495 查看
概述:
比较基础的数据结构题目。这里只给代码。需要注意的是这个的快排基于萨尼的数据结构。可能与严版教材实现不同。
快速排序的非递归实现使用栈和队列实现均可。
只是处理左右段先后顺序的不同!
注意:这里没有给出模版类的实现。
需要模版类稍作改动即可。
快速排序递归实现
void swap(int &a,int &b){ int c =a; a = b; b = c; } void quicksort(int * a, int start, int end) { if (start >=end) return; int pivot = a[start]; int i = start; int j = end+1; while (1) { do { i++; } while (a[i] < pivot); do { j--; }while (a[j] > pivot); if (i >= j) break; swap(a[i], a[j]); } a[start] = a[j]; a[j] = pivot; quicksort(a,start,j-1); quicksort(a,j+1,end); } void quicksort(int * a, int n) { if (n <= 1) { return; } quicksort(a, 0, n - 1); }
快速排序的非递归实现
基于栈stackvoid swap(int &a, int &b) { int c = a; a = b; b = c; } int partition(int * a, int start, int end) //返回支点pivot的索引! { int pivot = a[start]; int i = start; int j = end + 1; while (1) { do {i++;} while (a[i] < pivot); do {j--;} while (a[j] > pivot); if (i >= j) break; swap(a[i], a[j]); } a[start] = a[j]; a[j] = pivot; return j; } void quicksort(int* a , int n) { if (n <= 1) return; stack<int> con; int mid = partition(a, 0, n - 1); if (0 < mid) { c ce2d on.push(0); con.push(mid - 1); } if (mid < n - 1) { con.push(mid + 1); con.push(n - 1); } while (!con.empty()) { int r = con.top(); //先放入l 后放入的r因为是栈所以先取出来的是r con.pop(); int l = con.top(); con.pop(); mid = partition(a, l, r); if (l< mid-1) { con.push(l); con.push(mid - 1); } if (mid+1 < r) { con.push(mid + 1); con.push(r); } } }
基于队列
void swap(int &a, int &b) { int c = a; a = b; b = c; } int partition(int * a, int start, int end) //返回支点pivot的索引! { int pivot = a[start]; int i = start; int j = end + 1; while (1) { do {i++;} while (a[i] < pivot); do {j--;} while (a[j] > pivot); if (i >= j) break; swap(a[i], a[j]); } a[start] = a[j]; a[j] = pivot; return j; } void quicksort2(int *a, int n ) { if (n <= 1) return; queue<int> con; int mid = partition(a, 0, n - 1); if (0 < mid - 1) { con.push(0); con.push(mid - 1); } if (mid + 1 < n - 1) { con.push(mid + 1); con.push(n - 1); } while (!con.empty()) { int l = con.front(); //l先入先取出来的就是l con.pop(); int r = con.front(); con.pop(); mid = partition(a, l, r); if (l<mid-1) { con.push(l); con.push(mid-1); } if (mid+1<r) { con.push(mid+1); con.push(r); } } }
归并排序的递归实现
void mergesort(int a [], int first, int last, int temp[]); void mergesort(int a[], int n) { //mergesort入口 int *p = new int ; if (n <= 1) return; mergesort(a, 0, n - 1, p); } void merge(int a[], int first, int mid, int last, int temp[]) { int i = first; int j = mid + 1; int n = mid; int m = last; int k = 0; while (i <= mid && j <= last) { if (a[i] < a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while (i <= mid) { temp[k++] = a[i++]; } while (j <= last) { temp[k++] = a[j++]; } for (int i = 0; i < k; ++i) { a[first + i] = temp[i]; } } void mergesort(int a [], int first, int last, int temp[]) { if (first < last) { mergesort(a, first, (first + last) / 2, temp); mergesort(a, 1 + (first + last) / 2, last, temp); merge(a, first, (first + last) / 2, last, temp); } }
归并排序非递归实现
void merge2(int *a , int *p , int start , int mid , int last) { int k = start; int i = start; int j = mid + 1; while (i <= mid && j <= last) if (a[i] <= a[j]) p[k++] = a[i++]; else p[k++] = a[j++]; while (i <= mid) p[k++] = a[i++]; while (j <= last) p[k++] = a[j++]; } void mergepass(int * a, int * p , int s, int n) { int i = 0; while (i + 2 * s <= n) { merge2(a, p, i, i + s - 1, i + 2 * s - 1); i += 2 * s; } if (i + s <= n - 1) //有两段,也就是说现在的i加上一个segment还不够n所以肯定还有 merge2(a, p, i, i + s - 1, n - 1); else //只有一段不到 for (int j = i; j <= n - 1; ++j) p[j] = a[j]; } void mergesort2(int a[ ], int n) { int *p = new int ; if (n <= 1) return; int s = 1; while (s < n) { mergepass(a, p, s, n); s += s; mergepass(p, a, s, n); s += s; } }
相关文章推荐
- 快速排序递归及非递归实现
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 快速排序 的原理及其java实现(递归与非递归)
- 分别使用递归和迭代实现快速排序
- 快速排序实现之递归与非递归
- 快速排序的递归和非递归实现
- 【Java】快速排序、归并排序、堆排序、基数排序实现总结
- 剑指offer--快速排序递归实现,年龄排序O(N)实现,旋转数组最小值查找
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- 快速排序递归与非递归代码实现与思考
- 快速排序非递归实现
- 快速排序的递归实现算法
- 霍尔快速排序 非递归 C++实现
- 快速排序的单链表递归实现
- 百度面试,快速排序非递归实现
- 快速排序递归和非递归实现
- 归并排序、插入排序、快速排序、二分查找的c++实现
- 快速排序的三种实现方式以及非递归版本
- 霍尔快速排序 非递归 C++实现
- Java 递归与非递归实现快速排序