码迷,mamicode.com
首页 > 其他好文 > 详细

最简单的两种快排----掌握思想和过程

时间:2016-08-04 15:03:57      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

 

  俗话说天下武功,无坚不破。对于算法当然也是要使用时间最快、占用空间最小的算法来实现了。下面就是最简单的两种快排(其实可以算是一种)。

  注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果。

 总之,师傅领进门,修行在个人。奋斗把!骚年!

 

冒泡排序、选择排序:

技术分享
 1 #include "cstdio"
 2 #include "iostream"
 3 using namespace std;
 4 
 5 void bubble_sort (int *a, int n) {
 6     int t;
 7     for (int i = 0; i < n - 1; ++i) {
 8         for (int j = 0; j < n - i - 1; ++j) {
 9             if (a[j] > a[j + 1]) {
10                 t = a[j];
11                 a[j] = a[j + 1];
12                 a[j + 1] = t;
13             }
14         }
15     }
16 }
17 
18 int main () {
19     int n, a[999];
20     cin >> n;
21     for (int i = 0; i < n; ++i)
22         cin >> a[i];
23     bubble_sort (a, n);
24     for (int i = 0; i < n; ++i)
25         cout << a[i] << " ";
26     cout << endl;
27     return 0;
28 }
bubble sort
技术分享
 1 #include "cstdio"
 2 #include "iostream"
 3 using namespace std;
 4 
 5 void selection_sort (int *a, int n) {
 6     int t;
 7     for (int i = 0; i < n; ++i) {
 8         for (int j = i; j < n; ++j) {
 9             if (a[i] > a[j]) {
10                 t = a[j];
11                 a[j] = a[i];
12                 a[i] = t;
13             }
14         }
15     }
16 }
17 
18 int main () {
19     int n, a[999];
20     cin >> n;
21     for (int i = 0; i < n; ++i)
22         cin >> a[i];
23     selection_sort (a, n);
24     for (int i = 0; i < n; ++i)
25         cout << a[i] << " ";
26     cout << endl;
27     return 0;
28 }
selection sort

如果说冒泡和选择排序都没有弄明白的话,那你对于排序可以只记个sort函数和头文件就行了。

 

基础快排1----选择左右两边为基准排序:

技术分享
 1 #include <bits/stdc++.h>//万能头文件
 2 using namespace std;
 3 
 4 void quick_sort (int a[], int l, int r) {
 5     if (l >= r) return ;
 6     int i = l, j = r;
 7     int key = a[l];
 8     while (i < j) {    ///这里不能带等号,,死循环
 9         while (i < j && a[j] >= key) {//<=是找有相同数字的时候
10             j --;    //选的左边作为key,所以就从右边开始.
11         }
12         a[i] = a[j];    //找到一个该交换的时候退出交换。
13         while (i < j && a[i] <= key) { //<=是找有相同数字的时候
14             i ++;
15         }
16         a[j] = a[i];    //同上
17     }
18     a[i] = key;
19     quick_sort (a, l, i - 1);////应该可以交换位置,因为这两个是等效的,
20     quick_sort (a, i + 1, r);////就是排序上次key两的的值
21 }
22 
23 int main () {
24     int n;
25     int a[999];
26     scanf ("%d", &n);
27     for (int i = 0; i < n; ++i)
28     {
29         scanf ("%d", &a[i]);
30     }
31     quick_sort (a, 0, n - 1);
32     for (int i = 0; i < n; ++i)
33     {
34         printf("%d ", a[i]);
35     }
36     printf("\n");
37     return 0;
38 }
Quick_sort_by_left
技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 void quick_sort (int a[], int l, int r) {
 5     if (l >= r) return ;
 6     int i = l, j = r;
 7     int key = a[r];
 8     while (i < j) {    ///这里不能带等号,,死循环
 9         while (i < j && a[i] <= key) {//<=是找有相同数字的时候
10             i ++;    //选的右边作为key,所以就从左边开始.
11         }
12         a[j] = a[i];    //找到一个该交换的时候退出交换。
13         while (i < j && a[j] >= key) { //<=是找有相同数字的时候
14             j --;
15         }
16         a[i] = a[j];    //同上
17     }
18     a[j] = key;//-----先替换的a[j],所以在这里补上.
19     quick_sort (a, l, i - 1);////可以交换位置,是等效的
20     quick_sort (a, i + 1, r);////就是排序上次key两的的值
21 }
22 
23 int main () {
24     int n;
25     int a[999];
26     scanf ("%d", &n);
27     for (int i = 0; i < n; ++i)
28     {
29         scanf ("%d", &a[i]);
30     }
31     quick_sort (a, 0, n - 1);
32     for (int i = 0; i < n; ++i)
33     {
34         printf("%d ", a[i]);
35     }
36     printf("\n");
37     return 0;
38 }
Quick_sort_by_right

  注意:理解代码里面等号的取舍!

 

基础快排2----选择任意数字为基准排序:

技术分享
 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 void quick_sort (int *a, int l, int r) {
 6     int i = l, j = r, key = a[l + (r - l) / 2];
 7     //int key = a[r]; 
 8     //从数列里面任意找一个key就行
 9     int t;
10     while (i < j) {
11         while (i < r && a[i] < key)    i ++;
12         //不能写成a[i] <= key,会跳过一些数字,导致不能排序
13         while (j > l && a[j] > key)    j --;
14         //这两个while可以交换位置,以左右为基准的快排不能交换
15         if (i <= j) {    //此处必须有等号,跳过相同的时候
16             t = a[i];
17             a[i] = a[j];
18             a[j] = t;
19 
20             i ++;
21             j --;
22         }
23     }
24     if (i <= r)    quick_sort (a, i, r);
25     // 这里的等号可有可无,没有最好,少一次循环
26     if (j > l)    quick_sort (a, l, j);
27 }
28 
29 int main () {
30     int n;
31     int a[999];
32     cin >> n;
33     for (int i = 0; i < n; ++i)
34         cin >> a[i];
35     quick_sort (a, 0, n - 1);
36     for (int i = 0; i < n; ++i)
37         cout << a[i] << " ";
38     cout << endl;
39     return 0;
40 }
Quick_sort_anyone

 欢迎码友评论,一起成长。

最简单的两种快排----掌握思想和过程

标签:

原文地址:http://www.cnblogs.com/Ddlm2wxm/p/5736420.html

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