算法题13 排序算法

1 快速排序

http://blog.csdn.net/morewindows/article/details/6684558 这篇博客介绍的非常清晰易懂了。主要就是挖坑,填坑+分治法策略。笔者这里就只贴出代码来

 1  void QuickSortCore(int arr[],int start,int end)
 2  {
 3      int i=start,j=end;
 4      //以起点为基准值,先挖一个坑,需要用一个比x小的值来填i坑
 5      int x=arr[i];
 6      while (i<j)
 7      {
 8          //从后向前寻找比x小的值
 9          while (i<j&&arr[j]>=x)
10          {
11              j--;
12          }
13          //填i的坑,等于挖了j的元素到i,需要一个比x大的数来填j的坑
14          if (i<j)
15          {
16              arr[i++]=arr[j];
17          }
18
19          //从前向后寻找比x大的值
20          while (j>i&&arr[i]<x)
21          {
22              i++;
23          }
24          //填j的坑,等于挖了i的元素到j,需要一个比x大的数来填i的坑
25          if (i<j)
26          {
27              arr[j--]=arr[i];
28          }
29
30      }
31      //基准值调整到中间,一趟快排以后使得x前面的数都小于x,x后面的数都大于等于x
32      arr[i]=x;
33
34      if (start<(i-1))
35      {
36          QuickSortCore(arr,start,i-1);
37      }
38      if (end>(i+1))
39      {
40          QuickSortCore(arr,i+1,end);
41      }
42
43  }
44
45  void QuickSort(int arr[],int len)
46  {
47      if (arr==NULL||len<=0)
48          throw std::exception("Invalid input.");
49
50      int reserve_num=0;
51      QuickSortCore(arr,0,len-1);
52
53      for (int i=0;i<len;i++)
54      {
55          cout<<arr[i]<<‘ ‘;
56      }
57      cout<<endl;
58  }
时间: 2024-10-13 06:38:49

算法题13 排序算法的相关文章

算法快速回顾——排序算法

常用排序算法有以下几种:冒泡排序.插入排序.快速排序.归并排序.堆排序. 本文将对五种常用算法分析并实现. //交换两个元素的值 这里列出几种不同写法 void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } void swap(int *a,int *b) { *a = (*a)^(*b); *b = (*b)^(*a); *a = (*a)^(*b); } void swap(int *a,int *b) { *a = *a + *

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

排序算法之简单排序算法

一.前言 其实排序对于前端工程师来说没有后端那么重要,不过理解排序的原理还是比较有用的.例如有些应用数据比较少量的就不需要用后台来排序,如果用php后端脚本等排序会增加后台的开销.放在前端岂不是更好,当然我们有一个前端的排序神器sort.当然也做了很多得优化,不过用sort排序还需要注意一点,sort默认不传参数时候的排序是按照字母顺序对数组中的元素进行排序,其实就是按照字符编码的顺序进行排序.        今天主要复习一下简单得排序,分别为冒泡排序.插入排序.选择排序,冒泡目前是我认为最简单

算法竞赛之排序算法初入门

关于排序的一些知识点 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.我们学习的排序是关于算法之中,对一些特定数据,按照一定的优先级顺序将数据及逆行合理化的排列,比如在最初学习C语言的时候,老师提到的冒泡排序.选择排序,这两个是基本的排序,原理也应该比较简单,其实最早接触到的就是两个数字比较大小,然后按升序或者降序排布的,这个应该是最早接触的排序了. 既然排序这么重要,我们就学习一下一些常见的排序算法吧,由于本人能力有限,

数据结构算法基础-内部排序算法

1 arr = [1,23,12,9,8,8,9,1,1,8,] 2 def quickSortCore(arr,start,end): 3 if start < end: 4 index = partition(arr,start,end) 5 quickSortCore(arr,start,index-1) 6 quickSortCore(arr,index+1,end) 7 8 def partition(arr,start,end): 9 key = arr[start] 10 whil

[算法] 十个经典排序算法

动图演示参考:https://www.cnblogs.com/onepixel/articles/7674659.html 基数排序参考:https://blog.csdn.net/double_happiness/article/details/72452243 1.常见的排序算法 2.算法分析 3.算法的实现 1)排序类 1 #ifndef _SORT_H_ 2 #define _SORT_H_ 3 4 #include<vector> 5 6 class Sort { 7 public:

算法:常用排序算法

最近整理了常用的排序算法,整理好,留下自己的思考过程. 1.冒泡排序: (1)平均时间复杂度:O(n2) (2)最好时间复杂度:O(n) (3)最坏时间复杂度:O(n2) (5)空间复杂度:O(1) (5)稳定性:稳定 (6)JavaScript实现: function bubble ( arr ) { var len = arr.length; var tmp; // 外层循环负责控制排序的趟数 for(var i = 0; i < len - 1; i++){ // 内层循环负责进行一趟排序