算法学习与实践之快速排序
2013-06-24 09:36
232 查看
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-Conquer Method)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
实例源代码:
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
实例源代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <string.h> int n; int *a; char srcfile[32] = "src.txt"; char dstfile[32] = "dst.txt"; int input(void) { FILE *fp; fp = fopen(srcfile, "r"); fscanf(fp, "%d\n", &n); a = (int *)malloc(n * sizeof(int)); for(int i = 0; i < n; i++) { fscanf(fp, "%d ", &a[i]); //printf("%d ", a[i]); } //printf("\n"); return 0; } int src(void) { FILE *fp; char str[32]; //printf("src:\n"); fp = fopen(srcfile, "w+"); sprintf(str, "%d\n", n); fputs(str, fp); srand((unsigned int)time(NULL)); for(int i = 0; i < n; i++) { a[i] = rand() % 1000000; //printf("%d ", a[i]); sprintf(str, "%d ", a[i]); fputs(str, fp); //fwrite(str, strlen(str), 0, fp); } //printf("\n"); fclose(fp); return 0; } int dst(void) { FILE *fp; char str[32]; fp = fopen(dstfile, "w+"); sprintf(str, "%d\n", n); fputs(str, fp); //printf("dst:\n"); for(int i = 0; i < n; i++) { //printf("%d ", a[i]); sprintf(str, "%d ", a[i]); fputs(str, fp); } //printf("\n"); fclose(fp); return 0; } int SelectPivot(int A[], int L, int H) { int pivot; pivot = L + rand() % (H - L + 1); return pivot; } int Partion(int A[], int L, int H) { int i, j, index, pivot; index = L + rand() % (H - L + 1); pivot = A[index]; i = L - 1; j = H + 1; while(1) { //for(int k = L; k <= H; k++) //printf("%d ", A[k]); //printf("\n"); while(A[++i] < pivot); if(i < j) { A[index] = A[i]; index = i; } while(A[--j] > pivot); if(i < j) { A[index] = A[j]; index = j; } //printf("%d %d\n", i, j); if(i > j) break; //printf("%d %d\n", i, j); } A[index] = pivot; return index; } void QuickSort(int A[], int L, int H) { int index; if(L >= H) return; index = Partion(A, L, H); QuickSort(A, L, index - 1); QuickSort(A, index + 1, H); } void sort(int A[], int N) { QuickSort(A, 0, N - 1); } int main(int argc, char **argv) { n = 100000; a = (int *)malloc(n * sizeof(int)); srand((unsigned)time(NULL)); src(); //strcpy(srcfile, argv[1]); //strcpy(dstfile, argv[2]); //input(); sort(a, n); dst(); free(a); return 0; }
相关文章推荐
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
- 机器学习实战第五章Logistic回归照葫芦画瓢算法实践
- 深度学习算法实践7---前向神经网络算法原理
- 简单算法学习之快速排序
- 深度学习算法实践5---线性回归算法实现
- 算法学习与实践之冒泡排序
- 深度学习算法实践4---Theano常用技巧
- C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
- 一步步学习数据结构和算法之快速排序效率分析及java实现
- 深度学习算法实践10---卷积神经网络(CNN)原理
- 算法学习与实践之归并排序
- 深度学习算法实践4---Theano常用技巧
- 深度学习算法实践8---BP算法详解
- 算法学习——快速排序
- 由快速排序引申而来--如何学习算法
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
- 深度学习算法实践1---开发环境搭建
- 深度学习算法实践10---卷积神经网络(CNN)原理
- 算法实践篇-快速排序
- 算法学习记录-排序——快速排序