1. 程式人生 > >最快最簡單的排序——桶排序(易懂版)

最快最簡單的排序——桶排序(易懂版)

最快最簡單的排序


在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下排序演算法。

120852kg1dvagi0b1ijtlv.png

  首先出場的我們的主人公小哼,上面這個可愛的娃就是啦。期末考試完了老師要將同學們的分數按照從高到低排序。小哼的班上只有5個同學,這5個同學分別考了5分、3分、5分、2分和8分,哎考的真是慘不忍睹(滿分是10分)。接下來將分數進行從大到小排序,排序後是8 5 5 3 2。你有沒有什麼好方法編寫一段程式,讓計算機隨機讀入5個數然後將這5個數從大到小輸出?請先想一想,至少想15分鐘再往下看吧(*^__^*) 。

113320k0qonzwpnzmt5gpb.png

我們這裡只需藉助一個一維陣列就可以解決這個問題。請確定你真的仔細想過再往下看哦。

首先我們需要申請一個大小為11的陣列int a[11]。OK現在你已經有了11個變數,編號從a[0]~a[10]。剛開始的時候,我們將a[0]~a[10]都初始化為0,表示這些分數還都沒有人得過。例如a[0]等於0就表示目前還沒有人得過0分,同理a[1]等於0就表示目前還沒有人得過1分……a[10]等於0就表示目前還沒有人得過10分。

113320lz09fp0o7ff7h8xf.png下面開始處理每一個人的分數,第一個人的分數是5分,我們就將相對應a[5]的值在原來的基礎增加1,即將a[5]的值從0改為1,表示5分出現過了一次。

113321w4iew2smzki8kmec.png

  第二個人的分數是3分,我們就把相對應a[3]的值在原來的基礎上增加1,即將a[3]的值從0改為1,表示3分出現過了一次。

113321rmecknx06n92ppu7.png

  注意啦!第三個人的分數也是“5分”,所以a[5]的值需要在此基礎上再增加1,即將a[5]的值從1改為2。表示5分出現過了兩次。

113321a4euiehmeehcgpeb.png

  按照剛才的方法處理第四個和第五個人的分數。最終結果就是下面這個圖啦。

113321k7vs6474q39bo517.png

  你發現沒有,a[0]~a[10]中的數值其實就是0分到10分每個分數出現的次數。接下來,我們只需要將出現過的分數打印出來就可以了,出現幾次就列印幾次,具體如下。  a[0]為0,表示“0”沒有出現過,不列印。  a[1]為0,表示“1”沒有出現過,不列印。  a[2]為1,表示“2”出現過1次,列印2。  a[3]為1,表示“3”出現過1次,列印3。  a[4]為0,表示“4”沒有出現過,不列印。  a[5]為2,表示“5”出現過2次,列印5 5。  a[6]為0,表示“6”沒有出現過,不列印。  a[7]為0,表示“7”沒有出現過,不列印。  a[8]為1,表示“8”出現過1次,列印8。  a[9]為0,表示“9”沒有出現過,不列印。  a[10]為0,表示“10”沒有出現過,不列印。  最終螢幕輸出“2 3 5 5 8”,完整的程式碼如下。
01
#include <stdio.h>
02int main()
03{
04int a[11],i,j,t;
05for(i=0;i<=10;i++)
06a[i]=0;  //初始化為0
07
08for(i=1;i<=5;i++)  //迴圈讀入5個數
09{
10scanf("%d",&t);  //把每一個數讀到變數t中
11a[t]++;  //進行計數
12}
13for(i=0;i<=10;i++)  //依次判斷a[0]~a[10]
14for(j=1;j<=a[i];j++)  //出現了幾次就列印幾次
15printf("%d ",i);
16getchar();getchar();
17//這裡的getchar();用來暫停程式,以便檢視程式輸出的內容
18//也可以用system("pause");等來代替
19return 0;
20}

輸入資料為

15 3 5 2 8

仔細觀察的同學會發現,剛才實現的是從小到大排序。但是我們要求是從大到小排序,這該怎麼辦呢?還是先自己想一想再往下看哦。

其實很簡單。只需要將for(i=0;i<=10;i++)改為for(i=10;i>=0;i–)就OK啦,快去試一試吧。

這種排序方法我們暫且叫他“桶排序”。因為其實真正的桶排序要比這個複雜一些,以後再詳細討論,目前此演算法已經能夠滿足我們的需求了。

  這個演算法就好比有11個桶,編號從0~10。每出現一個數,就將對應編號的桶中的放一個小旗子,最後只要數數每個桶中有幾個小旗子就OK了。例如2號桶中有1個小旗子,表示2出現了一次;3號桶中有1個小旗子,表示3出現了一次;5號桶中有2個小旗子,表示5出現了兩次;8號桶中有1個小旗子,表示8出現了一次。

113324mbblb83a3ij09lqf.png

  現在你可以請嘗試一下輸入n個0~1000之間的整數,將他們從大到小排序。提醒一下如果需要對資料範圍在0~1000之間的整數進行排序,我們需要1001個桶,來表示0~1000之間每一個數出現的次數,這一點一定要注意。另外此處的每一個桶的作用其實就是“標記”每個數出現的次數,因此我喜歡將之前的陣列a換個更貼切的名字book(book這個單詞有記錄、標記的意思),程式碼實現如下。
01#include <stdio.h>
02int main()
03{
04int book[1001],i,j,t,n;
05for(i=0;i<=1000;i++)
06book[i]=0;
07scanf("%d",&n);//輸入一個數n,表示接下來有n個數
08for(i=1;i<=n;i++)//迴圈讀入n個數,並進行桶排序
09{
10scanf("%d",&t);  //把每一個數讀到變數t中
11

相關推薦

簡單排序——排序易懂

最快最簡單的排序在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下排序演算法。  首先出場

排序算法java

emp ive public while href ava 指針 循環 lec 1. 冒泡算法2. 快速排序3. 歸並排序4. 選擇排序5. 堆排序 排序算法 重要性不言而喻,很多算法問題往往選擇一個好的排序算法往往問題可以迎刃而解 1、冒泡算法

生成十個0~100之間的隨機數,放到陣列中,然後排序輸出。random [必做題]

import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class randos { public static void main(String[] args) { Sc

Apache伺服器新版下載、安裝及配置windows

這段時間因為專案原因需要用到Apache,第一次接觸這玩意兒,本想查查資料,但看到windows下大多數用到的都是.exe直接安裝的,但這樣傻瓜式操作,沒多大好處,具體就不多說了。言歸正傳,下面來講講

【python學習】——簡單購物系統實現進化

實現功能有:輸入賬號,密碼。根據賬號密碼會判斷為買家還是賣家,或者是已經被凍結的賬號(密碼輸入三次錯誤賬號就將被凍結)。買家入口:    1.根據序號購買商品    2.每次購買完成,都會顯示本次購買的商品以及餘額    3.若餘額不足,會提示購買失敗    4.按q鍵可退出

自己動手寫一個簡單的MVC框架第二

一、ASP.NET MVC核心機制回顧   在ASP.NET MVC中,最核心的當屬“路由系統”,而路由系統的核心則源於一個強大的System.Web.Routing.dll元件。   在這個System.Web.Routing.dll中,有一個最重要的類叫做UrlRoutingModule,它是一個

輸入日期判斷為該年第幾天 易懂

#include<stdio.h> int main() {   int i,j,k;   while(scanf("%d/%d/%d",&i,&j,&k) !=

卡特蘭數的應用易懂

不符合要求的數的特徵是由左而右掃描時,必然在某一奇數位2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即一個不

資料庫主鍵、從鍵易懂

什麼是主鍵、外來鍵: 關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵 比如: 學生表(學號,姓名,性別,班級) 其中每個學生的學號是唯一的,學號就是一個主鍵 課程表(課程編號,課程名,學分) 其中課程編號是唯一的,課程編號就是一個主鍵 成績

排序演算法1:簡單排序——排序C++版本

下面我要開始摘抄總結了。。。。文字來源於部落格2。。。 1.什麼是桶排序 桶排序,也叫做箱排序,是一種排序演算法,也是排序演算法中最快、最簡單的排序演算法。其中的思想是我們首先要知道所有待排序的範圍,然後需要有在這個範圍的同樣數量的桶,接

啊哈!演算法】簡單排序——排序

最快最簡單的排序——桶排序   在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下

【啊哈!演算法】演算法1:簡單排序——排序

《啊哈C》出版之後,很多網友希望能夠有加深的內容,比如資料結構、演算法之類的。今後每週五更新一篇吧。最快最簡單的排序——桶排序  在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照

【演算法】簡單排序——排序

在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下排序演算法。    首先出場的我們的主人

簡單排序——排序

  在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我們舉個具體的例子來介紹一下排序演算法。   

leetcode算法題3:分組,讓每個組的小者,相加之後和大。想知道排序是怎麽樣的嗎?

get ons 表示 note stdlib.h 不為 ask include tor /* Given an array of 2n integers, your task is to group these integers into n pairs of intege

簡單的部署本地Apache+PHP+MySQL神器USBWebserver

包含 .com col 最快最簡單 dmi 分享圖片 admin 目錄 www. 搭建本地服務器環境的軟件有很多,比如什麽PHPNOW、Almp、XAMPP等等好多;<br> 之前分享過一個《網站本地搭建PHP+Mysql環境運行網站教程》用是PHPno

24.C語言排序方法小結不斷更新

http 希爾 找到 sin -s arr span 計算機 gpo 希爾排序: 該方法的基本思想是:先將整個待排元素序列切割成若幹個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全

全】經典排序算法C語言

排好序 而不是 lock wap 循環 而且 -s 關鍵字 void 本文章包括所有基本排序算法(和其中一些算法的改進算法): 直接插入排序、希爾排序、直接選擇排序、堆排序、冒泡排序、快速排序、歸並排序、基數排序。 算法復雜度比較: 算法分類 一、直接插入排序 一個

這可能是透徹的氣泡排序演算法解析java實現

氣泡排序是一種思想簡單,便於理解和實現的排序演算法,也許是很多人學習的第一個排序演算法,廢話不多說,我們來實現它 演算法詳解 我們以升序排列為例,演算法的思想是,遍歷整個陣列,依次對陣列中的每兩個數進行比較大小,通過兩個數字的交換,達到將最大的元素移動到陣列的最

簡單排序個人練習演算法

這個桶排序只是一個10以內的整數的排序,屬於一個比較簡單的。只是作為個人學習演算法的練習,在此分享出來,請指教! C程式碼: #include <stdio.h> /* *描述:桶排序