算法学习 - 归并排序,快速排序,冒泡排序
来源:互联网 发布:php curl exec 超时 编辑:程序博客网 时间:2024/04/30 16:22
归并排序
现在的归并排序一般都是二路归并,多路归并用在外部排序比较多一点。
归并排序就是从头遍历两个有序的序列,然后放到第三个空列表里,依次放如两个列表头较小的那个元素。
下面是代码:
//// main.cpp// MergeSort//// Created by Alps on 14-8-2.// Copyright (c) 2014年 chen. All rights reserved.//#include <iostream>#define ElementType intusing namespace std;void Merge(int *A, int left, int right, int center, int *TmpArr){ int leftPtr = left, rightPtr = center; int i = left; while (leftPtr < center && rightPtr <= right) { if (A[leftPtr] <= A[rightPtr]) { TmpArr[i++] = A[leftPtr]; leftPtr++; }else{ TmpArr[i++] = A[rightPtr]; rightPtr++; } } if (leftPtr >= center) { while (rightPtr <= right) { TmpArr[i++] = A[rightPtr]; rightPtr++; } } if (rightPtr > right) { while (leftPtr < center) { TmpArr[i++] = A[leftPtr]; leftPtr++; } } for (int j = left; j <= right ; j++) { A[j] = TmpArr[j]; }}void MSort(int *A, ElementType *TmpArr, int left, int right){ if (left < right) { int center = (left+right)/2; MSort(A, TmpArr, left,center); MSort(A, TmpArr, center+1, right); Merge(A,left, right, center+1, TmpArr); }}void MergeSort(int *A, int length){ ElementType TmpArr[length]; int left = 0,right = length-1; MSort(A, TmpArr, left, right); for (int i = 0; i < length; i++) { printf("%d ",A[i]); } printf("\n");}int main(int argc, const char * argv[]){ ElementType A[] = {24, 13, 26, 1, 2, 27, 38, 15}; MergeSort(A, sizeof(A)/sizeof(ElementType)); return 0;}
快速排序
快速排序是一个用的很多的排序算法,它的时间复杂度平均为O(NlogN),但是重要的是要选择好正确的flag元素。我认为和归并正好相反,归并是先分成很多段,然后把各个段合并起来,快排是把一个长序列不断的有序的分成很多段,直接就排序好了。
下面时代码:
//// main.cpp// QuickSort//// Created by Alps on 14-8-2.// Copyright (c) 2014年 chen. All rights reserved.//#include <iostream>#define ElementType intvoid QuickSort(ElementType *A, int left, int right){ if (left < right) { int i = left, j = left; int mid = right; for (int k = left; k < right; k++) { if (A[j] <= A[mid]) { A[i] += A[j]; A[j] = A[i]-A[j]; A[i] = A[i]-A[j]; i++; j++; }else{ j++; } } A[i] = A[i]+A[mid]; A[mid] = A[i]-A[mid]; A[i] = A[i]-A[mid]; mid = i; QuickSort(A, left, mid-1); QuickSort(A, mid+1, right); } }int main(int argc, const char * argv[]){ ElementType A[] = {24, 13, 26, 1, 2, 27, 38, 15}; int length = sizeof(A)/sizeof(ElementType); QuickSort(A, 0, length-1); for (int i = 0; i < length; i++) { printf("%d ",A[i]); } printf("\n"); return 0;}
冒泡排序
这个排序算法是最基础的了,就简单的直接说下,就是每次遍历把最大的数字放到序列最后,这样不断遍历,就可以了,所以时间复杂度比较高是O(N2)。
代码:
//// main.cpp// BubbleSort//// Created by Alps on 14-8-2.// Copyright (c) 2014年 chen. All rights reserved.//#include <iostream>#define ElementType intvoid BubbleSort(int *A, int length){ for (int i = 0; i < length; i++) { for (int j = 0; j < length-i-1; j++) { if (A[j] > A[j+1]) { A[j] += A[j+1]; A[j+1] = A[j]-A[j+1]; A[j] = A[j] - A[j+1]; } } }}int main(int argc, const char * argv[]){ ElementType A[] = {24, 13, 26, 1, 2, 27, 38, 15}; int length = sizeof(A)/sizeof(ElementType); BubbleSort(A, length); for (int i = 0; i < length; i++) { printf("%d ",A[i]); } printf("\n"); return 0;}
0 0
- 算法学习 - 归并排序,快速排序,冒泡排序
- 排序算法--冒泡排序,归并排序,快速排序
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序算法比较
- java 排序算法小节 直接插入排序 冒泡排序 选择性排序 快速排序 归并排序
- Javascript排序算法(冒泡排序,选择排序,插入排序,归并排序,快速排序)
- 冒泡排序,快速排序,归并排序
- c排序算法:选择、冒泡、插入、快速、归并、堆排序
- 各种排序算法-Java-冒泡、选择、插入、快速、归并排序
- 排序-交换类排序-快速排序、归并排序、冒泡排序
- 【算法】排序 (二):冒泡排序&快速排序&归并排序&基数排序&拓扑排序(C++实现)
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 七种排序算法,包括:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序
- 【更新】排序算法比较:插入排序,冒泡排序,归并排序,堆排序,快速排序,计数排序,基数排序,桶排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 冒泡 快速 堆排序 归并排序学习示例
- 归并排序学习总结,递归法&&插入排序&&冒泡排序&&选择排序&&快速排序
- Android概览(一):两分钟彻底让你明白Android Activity生命周期(图文)
- 中断不可睡眠的一些理解
- 多重背包的可行性问题
- Html - web 第一语言, 学习笔记 (二)
- linux 的socket编程
- 算法学习 - 归并排序,快速排序,冒泡排序
- linux内核之链表结构分析
- 黑马程序员:7K面试题之银行业务调度系统
- LeetCode-Distinct Subsequences
- android滑动之Scroller
- alter session set current_schema=Schema
- storm博客收藏
- windows.h与winsock2.h的包含顺序引起的问题
- 最长回文子串(中间扩展法)