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

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

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

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

冒泡排序、选择排序:

 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

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

时间: 2024-10-07 12:21:26

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

编程练习:合并两个数组(包括三种快排程序)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /*确定快排1的分界值*/ 5 int partition1(int array[],int r,int m){ 6 int i,j=m,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换: 7 //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, 8 //当遇到

C语言播放声音最简单的两种方法

1. 假设仅须要播放波形文件wav格式的声音,非常easy.仅仅需一句话: PlaySound(TEXT("Data\\1.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 在这里仅仅提供方法,具体问题自己去探索. 完整C语言代码: #include <windows.h> #pragma comment(lib, "Winmm.lib") int main(int argc, char *argv[]

vue使用json最简单的两种方式

第一种: 首先我项目是在 webpack 下搭建的vue项目 在public文件夹下创建jsonTest.json json 格式的数据如下: { "innerList": [ {"attr1":"内部数据1","attr2":"内部数据2",...}, {"attr1":"内部数据1","attr2":"内部数据2",...}

Git简单介绍两种拉取代码的方式

first: 1.通过git clone 命令克隆git库中的项目 具体操作命令: //克隆git库中的代码,后面的https地址换成自己的git库地址就好,注意:不要使用ssh git clone https://gitee.com/yulongcode/TestGit.git //查看本地git库的文件修改状态 git status //将本地修改的代码提交到暂存区 ./ 也可以换成具体的文件名 git add ./ //给将要提交的代码写注释 git commit -m '代码提交注释'

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

初探快排

学了数据结构,实现下快排, public void QuickSort1(float[] seq,int low,int hight){int i = low;//记录最左值索引int j = hight;//记录最右值索引float temp = seq[low];//记录比较值(此处是最左值)while (low < hight)//每轮比较{while (low < hight && temp >= seq[hight]){hight--;}seq[low] = s

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘 淘宝seo快排技术 今天,我在志在指尖群里面看了看,有人说做一个排名其实非常的简单(我去,简单?想做好seo这是何等漫长的一个事情,谈何简单)我们都知道,做好seo,不仅要做好站内,也要做好站外,不管是关键词布局,内链布局等,还是外链创设,在这是文章书写等,这都是需要很大耐心以及技术的.所以,我没打扰他,我就想听听他口中所谓seo'简单'二字是什么意思,结果意想不到,他就直说了四个字-淘宝快排-what fuck?这四个字让我笑得肚子疼(这里

快速排序--QuickSort,看完五分彩开奖网平台搭建自己就能写出来的快排思路推演

快速五分彩开奖网平台搭建论坛:haozbbs.com Q1446595067排序(QuickSort)介绍首先发明者竟然敢给自己发明的算法叫做QuickSort,这个名字闪不闪亮?好比别的武功叫做六脉神剑.降龙十八掌,我这个叫做"天下无敌神功".别的排序算法都是按照特点来起的,你这个不是应该叫分块递归排序法吗?或者和希尔一样,叫做霍尔排序也可以啊,这么高调是要干啥啊?我给了他一次机会,特意去查了一下,这个名字并不是江湖朋友抬爱给的,就是发明者自己起的,社会社会...不过看完这篇博客,理