码迷,mamicode.com
首页 > 编程语言 > 详细

Standard C++ Episode 9

时间:2015-08-21 07:01:01      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

程序设计=数据结构+算法  外加"设计方法学"
数值算法:微积分、方程组、有限元分析等—工程计算。
非数值算法:查找、排序、决策、调度—系统编程。
一、冒泡排序
1.算法
1)比较相邻的元素,如果第一个比第二个大,就交换它们俩;
2)对每一对相邻的元素做同样的工作,从开始的第一对到结尾的最后一对,使最后的元素为最大值;
3)针对的所有的元素重复以上步骤,除了最后一个;
4)持续每次对越来越少的元素重复以上步骤,直到没有元素需要交换为止。
2.评价
平均时间复杂度:O(N^2)
稳定
对数据的有序性非常敏感
二、插入排序
1.算法
1)从第一个元素开始,该元素可以认为已经有序;
2)取出下一个元素,在已经有序的序列中从后向前扫描;
3)若该元素大于新元素,则将该元素移到下一个位置;
4)若该元素小于等于新元素,则将新元素放在该元素之后;
5)重复步骤2),直到处理完所有元素。
2.评价
平均时间复杂度:O(N^2)
稳定
对数据的有序性非常敏感
因为没有交换,所以赋值的次数比冒泡少,速度比冒泡略快。
三、选择排序
1.算法
首先在未排序序列中找到最小元素,与该序列的首元素交换,再从剩余未排序元素中继续寻找最小元素,放到有序序列的末尾。以此类推,直到所有元素均排序完毕。
2.评价
平均时间复杂度:O(N^2)
稳定
对数据的有序性不敏感
因为交换的次数少,所有速度比冒泡略快。


四、快速排序

1.算法
1)从序列中选出一个元素作为基准;
2)重排序列,所有比基准小的元素位于基准左侧,比基准大的元素位于基准右侧,和基准相等的元素位于任意一侧,此过程称为分组;
3)以递归的方式对小于基准的分组和大于基准的分组分别进行排序。
2.评价
平均时间复杂度:O(NlogN)

不稳定

如果每次能够均匀分组速度将是最快的。


五、归并排序

1.算法
1)申请空间,其大小为两个有序序列之和;
2)设定两个指针,分别指向两个有序序列的起始位置;
3)比较两个指针的目标,选择小值放入合并空间,并将指针移到下一个位置;
4)重复步骤3)直到某一个指针到达序列尾;
5)将另一序列的剩余元素直接复制到合并空间。
2.评价
平均时间复杂度:O(2NlogN)
稳定
对数据的有序性不敏感
非就地排序,不适用于大数据量的排序。

 

 

 

  1 #include <iostream>
  2 using namespace std;
  3 // 冒泡排序
  4 void bubbleSort (int data[], size_t size) {
  5     for (size_t i = 0; i < size - 1; ++i) {
  6         bool ordered = true;
  7         for (size_t j = 0; j < size - 1 - i; ++j)
  8             if (data[j+1] < data[j]) {
  9                 int temp = data[j+1];
 10                 data[j+1] = data[j];
 11                 data[j] = temp;
 12                 ordered = false;
 13             }
 14         if (ordered)
 15             break;
 16     }
 17 }
 18 // 插入排序
 19 void insertSort (int data[], size_t size) {
 20     for (size_t i = 1; i < size; ++i) {
 21         int temp = data[i];
 22         size_t j;
 23         for (j = i; j > 0 && temp < data[j-1]; --j)
 24             data[j] = data[j-1];
 25         if (j != i)
 26             data[j] = temp;
 27     }
 28 }
 29 // 选择排序
 30 void selectSort (int data[], size_t size) {
 31     for (size_t i = 0; i < size - 1; ++i) {
 32         size_t min = i;
 33         for (size_t j = i + 1; j < size; ++j)
 34             if (data[j] < data[min])
 35                 min = j;
 36         if (min != i) {
 37             int temp = data[i];
 38             data[i] = data[min];
 39             data[min] = temp;
 40         }
 41     }
 42 }
 43 // 快速排序
 44 void quickSort (int data[], size_t left,
 45     size_t right) {
 46     size_t p = (left + right) / 2;
 47     int pivot = data[p];
 48     for (size_t i = left, j = right; i < j;) {
 49         while (! (i>= p || pivot < data[i]))
 50             ++i;
 51         if (i < p) {
 52             data[p] = data[i];
 53             p = i;
 54         }
 55         while (! (j <= p || data[j] < pivot))
 56             --j;
 57         if (j > p) {
 58             data[p] = data[j];
 59             p = j;
 60         }
 61     }
 62     data[p] = pivot;
 63     if (p - left > 1)
 64         quickSort (data, left, p - 1);
 65     if (right - p > 1)
 66         quickSort (data, p + 1, right);
 67 }
 68 // 异地合并
 69 void merge (int data1[], size_t size1, int data2[],
 70     size_t size2, int data3[]) {
 71     size_t i = 0, j = 0, k = 0;
 72     for (;;)
 73         if (i < size1 && j < size2)
 74             if (data1[i] <= data2[j])
 75                 data3[k++] = data1[i++];
 76             else
 77                 data3[k++] = data2[j++];
 78         else if (i < size1)
 79             data3[k++] = data1[i++];
 80         else if (j < size2)
 81             data3[k++] = data2[j++];
 82         else
 83             break;
 84 }
 85 // 本地合并
 86 void merge (int data[], size_t l, size_t m,
 87     size_t r) {
 88     int* res = new int[r-l+1];
 89     merge (data+l, m-l+1, data+m+1, r-m, res);
 90     for (size_t i = 0; i < r-l+1; ++i)
 91         data[l+i] = res[i];
 92     delete[] res;
 93 }
 94 // 归并排序
 95 void mergeSort (int data[], size_t left,
 96     size_t right) {
 97     if (left < right) {
 98         int mid = (left + right) / 2;
 99         mergeSort (data, left, mid);
100         mergeSort (data, mid+1, right);
101         merge (data, left, mid, right);
102     }
103 }
104 int main (void) {
105     int data[] = {13,23,20,12,15,31,19,26,24,37};
106     size_t size = sizeof (data) / sizeof (data[0]);
107 //    bubbleSort (data, size);
108 //    insertSort (data, size);
109 //    selectSort (data, size);
110 //    quickSort (data, 0, size - 1);
111     mergeSort (data, 0, size - 1);
112     for (size_t i = 0; i < size; ++i)
113         cout << data[i] <<  ;
114     cout << endl;
115     /*
116     int data1[] = {10, 20, 30, 45, 66};
117     int data2[] = {15, 18, 27, 33};
118     int data3[9];
119     merge (data1, 5, data2, 4, data3);
120     for (size_t i = 0; i < 9; ++i)
121         cout << data3[i] << ‘ ‘;
122     cout << endl;
123     // 10 15 18 20 27 30 33 45 66
124     /*
125     int data[] = {100,10,20,30,45,66,15,18,27,33,0};
126     merge (data, 1, 5, 9);
127     for (size_t i = 0; i < 11; ++i)
128         cout << data[i] << ‘ ‘;
129     cout << endl;
130     // 100 10 15 18 20 27 30 33 45 66 0
131     */
132     return 0;
133 }

 

 

 

 1 /*
 2  *  泛型的快速排序
 3 &nbsp;*
 4 &nbsp;* C语言标准库中提供的快速排序就是通过函数指针、通过内存拷贝实现了泛型;
 5 &nbsp;* C语言向下泛型,因为物理层面他们计算机中的信息没有类型区别;
 6  */
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <stdlib.h>
10 static void quickSort (void* base, size_t left,
11     size_t right, size_t size, int (*compar) (
12     const void*, const void*)) {
13     size_t p = (left + right) / 2;
14     void* pivot = malloc (size);
15     memcpy (pivot, base + p * size, size);
16     size_t i, j;
17     for (i = left, j = right; i < j;) {
18         while (! (i >= p || compar (pivot,
19             base + i * size) < 0))
20             ++i;
21         if (i < p) {
22             memcpy (base + p * size,
23                 base + i * size, size);
24             p = i;
25         }
26         while (! (j <= p || compar (
27             base + j * size, pivot) < 0))
28             --j;
29         if (j > p) {
30             memcpy (base + p * size,
31                 base + j * size, size);
32             p = j;
33         }
34     }
35     memcpy (base + p * size, pivot, size);
36     free (pivot);
37     if (p - left > 1)
38         quickSort (base, left, p - 1, size, compar);
39     if (right - p > 1)
40         quickSort (base, p+1, right, size, compar);
41 }
42 void my_qsort (void* base, size_t numb, size_t size,
43     int (*compar) (const void*, const void*)) {
44     quickSort (base, 0, numb -1, size, compar);
45 }
46 int cmpInt (const void* a, const void* b) {
47     return *(const int*)a - *(const int*)b;
48 }
49 int cmpStr (const void* a, const void* b) {
50     return strcmp (*(const char* const*)a,
51         *(const char* const*)b);
52 }
53 int main (void) {
54     int na[] = {34, 22, 19, 27, 30};
55     size_t size = sizeof (na[0]);
56     size_t numb = sizeof (na) / size;
57 //    qsort (na, numb, size, cmpInt);
58     my_qsort (na, numb, size, cmpInt);
59     size_t i;
60     for (i = 0; i < numb; ++i)
61         printf ("%d ", na[i]);
62     printf ("\n");
63     const char* sa[] = {"beijing", "chongqing",
64         "shanghai", "tianjin", "guangzhou"};
65     size = sizeof (sa[0]);
66     numb = sizeof (sa) / size;
67 //    qsort (sa, numb, size, cmpStr);
68     my_qsort (sa, numb, size, cmpStr);
69     for (i = 0; i < numb; ++i)
70         printf ("%s ", sa[i]);
71     printf ("\n");
72     return 0;
73 }

 

 

  1 /*
  2  * 泛型的快速排序
  3  *
  4  * C语言标准库中提供的快速排序通过函数指针、通过内存拷贝实现了泛型;而C++因为可以让对象支持统一的行为(比如都支持* /->操作), 进而通过C++的模板就也实现了泛型;
  5  * 他们的区别是:
  6  * C语言向下泛型,因为物理层面他们计算机中的信息没有类型区别;
  7  * C++语言向上泛型,因为C++通过对行为的抽象,通过让对象支持统一的行为,对于统一的行为通过模板实现泛型。
  8  */
  9 #include <iostream>
 10 #include <vector>
 11 #include <list>
 12 using namespace std;
 13 template<class iterator>
 14 void print(iterator begin, iterator end)
 15 {
 16     while (begin != end) {
 17     cout << *begin++ <<  ;
 18     }
 19 
 20     cout << endl;
 21 }
 22 template<typename type>
 23 void my_swap (type& a, type& b) {
 24     type c = a;
 25     a = b;
 26     b = c;
 27 }
 28 template<typename iterator>
 29 void my_sort (iterator begin, iterator end) {
 30     iterator p = begin;
 31     iterator last = end;
 32     --last;
 33     for (iterator i = begin, j = last; i != j;) {
 34         while (! (i == p || *p < *i))
 35             ++i;
 36         if (i != p) {
 37             my_swap (*p, *i);
 38             p = i;
 39         }
 40         while (! (j == p || *j < *p))
 41             --j;
 42         if (j != p) {
 43             my_swap (*p, *j);
 44             p = j;
 45         }
 46     }
 47     iterator it = begin;
 48     ++it;
 49     if (p != begin && p != it)
 50         my_sort (begin, p);
 51     it = p;
 52     ++it;
 53     if (it != end && it != last)
 54         my_sort (it, end);
 55 }
 56 template<typename iterator, typename comparator>
 57 void my_sort (iterator begin, iterator end,
 58     comparator cmp) {
 59     iterator p = begin;
 60     iterator last = end;
 61     --last;
 62     for (iterator i = begin, j = last; i != j;) {
 63         while (! (i == p || cmp (*p, *i)))
 64             ++i;
 65         if (i != p) {
 66             my_swap (*p, *i);
 67             p = i;
 68         }
 69         while (! (j == p || cmp (*j, *p)))
 70             --j;
 71         if (j != p) {
 72             my_swap (*p, *j);
 73             p = j;
 74         }
 75     }
 76     iterator it = begin;
 77     ++it;
 78     if (p != begin && p != it)
 79         my_sort (begin, p, cmp);
 80     it = p;
 81     ++it;
 82     if (it != end && it != last)
 83         my_sort (it, end, cmp);
 84 }
 85 
 86 //测试用例
 87 class CmpInt {
 88 public:
 89     bool operator() (int a, int b) const {
 90         return a > b;
 91     }
 92 };
 93 
 94 
 95 bool Compare(int a, int b)
 96 {
 97     return a > b;
 98 }
 99 
100 
101 
102 int main (void) {
103     int na[] = {13, 24, 22, 19, 44, 56, 88, 22};
104     vector<int> vi (na, na + 8);
105     list<int> li (na, na + 8);
106     my_sort (na, na + 8);
107     print (na, na + 8);
108     my_sort (vi.begin (), vi.end ());
109     print (vi.begin (), vi.end ());
110     my_sort (li.begin (), li.end (), CmpInt ());
111     print (li.begin (), li.end ());
112     my_sort (li.begin (), li.end (),Compare);
113     print (li.begin (), li.end ());
114     return 0;
115 }

 

 

 

六、线性查找
1.算法
从表头开始依次比较,直到找到与查找目标匹配的元素,或者找不到。
2.评价
平均时间复杂度:O(N)
对数据的有序性没有要求

七、二分查找

1.算法
首先必须保证查找样本必须有序,将表中值与查找目标进行比较,如果二者相等,则查找成功,否则根据查找目标比中值大或者小,在其右侧或者左侧继续前述过程。直到查找成果或者失败。
2.评价
平均时间复杂度:O(logN)

Standard C++ Episode 9

标签:

原文地址:http://www.cnblogs.com/libig/p/4746718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!