一學就廢的三種簡單排序【冒泡、插入、選擇】

文章目錄

  • 其他排序算法
  • 冒泡排序
    • 算法實現
    • 代碼實例
  • 插入排序
    • 算法實現
    • 代碼實例
  • 選擇排序
    • 算法實現
    • 代碼實例


其他排序算法

一學就廢的歸并排序


冒泡排序

排列順序從前到后或者從后往前都可,本文選擇從后到前的順序,升序排列:比較相鄰兩個元素,大的放后面,小的放前面,(降序排列反之)第一個for決定排列數組下標為i的元素,第二個for執行i遍比較過程。
點擊這里可以看到動畫版的冒泡排序【一個很有趣的網站】


算法實現

void sort(int* a,int len){//冒泡排序,a為數組首地址,len為數組長度int temp;for(size_t i = len; 0 < i; i--){//確定數組下標為i的元素for(size_t j = 0; j < i; j++){//執行i遍比較過程if(a[j+1] < a[j]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}
}

代碼實例

#include <iostream>
using namespace std;void sort(int* a,int len){int temp;for(size_t i = len; 0 < i; i--){//冒泡排序for(size_t j = 0; j < i; j++){if(a[j+1] < a[j]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}}

插入排序

排列順序從前到后或者從后往前都可,本文選擇從前到后的順序,每次要確定的數組元素的值要先存入一個臨時變量中(例如下面的temp),再將它之前的元素與它比較,比它大的都往后移動一位(降序排列操作反之),例如:a[7]={1,3,5,2,4,8,7}中,假設此時已經過3輪排序,該執行第4輪排序時,將2賦值給temp,之后將3,5向后移,然后將temp的值賦給a[2],這樣就相當于做了一個將2插入1,3之間的操作。每個元素都做這樣一個操作之后,整個數組便完成排序了。

ps:上文的網站也可以看插入排序


算法實現

void sort(int* a,int len) {//插入排序,升序排列int temp,i,j;for(i = 1; i < len; i++){//決定第i個元素temp = a[i];//先將要插入的值賦給臨時變量防止以數據丟失for(j = i; 0 < j; j--){//執行i遍比較if(temp < a[j-1]){//a[i]之前的元素比temp大的往后移一位a[j] = a[j-1];}else{break;//找到了該插入的位置,退出本層循環,決定下一個元素的位置}}a[j] = temp;//將元素插入到其該存在的位置}
}

代碼實例

#include<iostream>
using namespace std;void sort(int* a,int len) {//插入排序,升序排列int temp,i,j;for(i = 1; i < len; i++){//決定第i個元素temp = a[i];for(j = i; 0 < j; j--){//執行i-1遍比較if(temp < a[j-1]){a[j] = a[j-1];}else{break;}}a[j] = temp;}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}return 0;
}

選擇排序

排列順序從前到后或者從后往前都可,本文選擇從前到后的順序,每次要確定的數組元素的值要先存入一個臨時變量中(例如下面的min),再將它之后的元素與它比較,如果某位置的元素比該位置元素值小(降序排列操作反之),則交換兩個位置的元素,并更新min的值,例如:a[7]={1,4,5,3,2,8,7}中,假設此時已經過1輪排序,該執行第2輪排序時,將4賦值給min,之后判定到a[3]時,發現min的值大于a[3](4>3),交換a[1]和a[3]的元素,也就是數組變成了a[7]={1,3,5,4,2,8,7},并更新min的值(min = 3),接下來繼續往后比較時發現min的值大于a[4] (3>2),則重復之前的操作,交換a[1]與a[4]的內容,也就是數組變成了a[7]={1,2,5,4,3,8,7},并更新min的值(min = 2),之后再無數組元素值小于min,遍歷完成,一輪排序結束。每個位置(除了最后一個位置,其他位置排好了之后,最后一個位置的元素自然而然就排好了)都做這樣一個操作之后,整個數組便完成排序了。
ps:上文的網站也可以看選擇排序


算法實現

void sort(int* a,int len) {//選擇排序,升序排列int min,i,j;for(i = 0; i < len-1; i++){//確定數組下標為i的元素min = a[i];//min作為臨時變量存儲當前最小的值for(j = i+1; j < len; j++){//執行n-i-1遍比較if(min > a[j]){//如果j位置的元素比i位置元素值小,則交換兩個位置的元素,并更新min的值a[i] = a[j];a[j] = min;min = a[i];}}}
}

代碼實例

#include<iostream>
using namespace std;void sort(int* a,int len) {//選擇排序,升序排列int min,i,j;for(i = 0; i < len-1; i++){//確定數組下標為i的元素min = a[i];//min作為臨時變量存儲當前最小的值for(j = i+1; j < len; j++){//執行n-i-1遍比較if(min > a[j]){a[i] = a[j];a[j] = min;min = a[i];}}}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443894.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百戰c++(2)

delete 和 delete []的真正區別 delete 對應 new delete[]對應new[]對于簡單類型包括簡單類型數組&#xff0c;delete 與delete[]沒有區別。對于自定義類型數組&#xff0c;delete 只會刪除一個元素&#xff0c;delete 則會刪除所有元素。 指針和數組的區別 野指針是什么 野指…

shell預先定義的特殊變量

文章目錄$#$*$$$# 表示命令行上參數的個數&#xff0c;但不包括shell腳本名本身 為腳本ex1賦予兩個變量&#xff0c;測試$#的輸出結果 [cmybogon test2]$ . ex1 ma.c mb.c 2 # echo $# 7 # cat $1 $2 $3 | wc -l 2 # echo $#腳本ex1的具體內容 [rootlocalhost test]$ cat ex1…

Linux實驗一:常用的Linux命令

文章目錄一、實驗目的二、實驗要求三、實驗內容1、系統的使用2、命令的使用3、文件操作4、系統詢問與權限口令5、其它常用命令四、實驗操作1、基本命令的使用2、文件和目錄操作3、創建用戶帳戶一、實驗目的 1、熟悉Linux的桌面環境&#xff1b; 2、了解Linux所安裝的軟件包 3、…

Linux實驗二:vi編輯器的使用

文章目錄一、實驗目的二、實驗要求三、實驗內容1、創建文件2、編輯文件一、實驗目的 1、練習并掌握Linux提供的vi編輯器來編譯C程序 2、學會利用gcc、gdb編譯、調試C程序 3、本次實驗的目的是讓同學們了解如何使用vi編輯器進行創建和編輯文件 二、實驗要求 1、文件編輯器vi…

百戰c++(os1)

Linux中的鎖 互斥鎖&#xff1a;mutex&#xff0c;用于保證在任何時刻&#xff0c;都只能有一個線程訪問該對象。當獲取鎖操作失敗時&#xff0c;線程會進入睡眠&#xff0c;等待鎖釋放時被喚醒 讀寫鎖&#xff1a;rwlock&#xff0c;分為讀鎖和寫鎖。處于讀操作時&#xff0…

Linux實驗三:Shell編程

文章目錄一、實驗目的二、實驗要求三、實驗內容1、通配符的使用2、重定向3、管道4、shell變量5、建立下面的腳本&#xff0c;運行并分析輸出結果&#xff0c;并給出代碼注釋。6、編寫腳本一、實驗目的 1.為文件擴展名使用通配符 2.標準輸入、標準輸出和標準錯誤的重定向 3.使…

a href=#與 a href=javascript:void(0) 的區別

a href"#"> 點擊鏈接后&#xff0c;頁面會向上滾到頁首&#xff0c;# 默認錨點為 #TOP<a href"javascript:void(0)" onClick"window.open()"> 點擊鏈接后&#xff0c;頁面不動&#xff0c;只打開鏈接<a href"#" οnclick&…

Linux實驗四:編譯和調試工具的使用

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容四、實驗操作1、用gcc編譯程序&#xff0c;寫出編譯過程&#xff0c;并給出運行結果。2、調試程序&#xff0c;要求用gdb進行調試并給出修改方案。3、make的使用一、實驗目的&#xff1a; 1、練習并掌握Linux提供的v…

Linux實驗五:Linux環境下的C語言編程

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容1、編寫一段C語言程序使其完成&#xff1a;父進程創建兩個子進程&#xff0c;每個進程都在屏幕上顯示自己的進程ID號。2、上機調試下面的程序&#xff0c;觀察運行結果&#xff0c;分析原因。3、利用兩個管道進行雙向…

百戰c++(4)

1.求下面函數的返回值&#xff08;微軟&#xff09; int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案&#xff1a;8 思路&#xff1a;將x轉化為2進制&#xff0c;看含有的1的個數。 2. 什么是“引用”&…

ndarray對象的建立

文章目錄ndarray&#xff08;別名array&#xff09;常用屬性創建NumPy數組使用array()函數使用zeros()函數使用ones()函數使用empty()函數使用arange()函數注意ndarray&#xff08;別名array&#xff09; 常用屬性 import numpy as np # Numpy工具包data np.arange(12).res…

百戰c++(5)

11. 已知strcpy的函數原型&#xff1a;char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串&#xff0c;strSrc 是源字符串。不調用C/C 的字符串庫函數&#xff0c;請編寫函數 strcpy。 答案&#xff1a; char *strcpy(char *strDest, const char *strS…

Numpy數組的廣播機制

文章目錄前言數組廣播廣播機制的使用條件前言 Numpy數組不需要循環遍歷&#xff0c;即可對每個元素執行批量的算術運算操作&#xff08;矢量化運算&#xff09;。當兩個數組大小&#xff08;Numpy.shape&#xff09;不同時&#xff0c;進行算術運算會出現廣播機制。 數組廣播…

百戰c++(6)

26. 描述內存分配方式以及它們的區別? 1&#xff09; 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好&#xff0c;這塊內存在程序的整個運行期間都存在。例如全局變量&#xff0c;static 變量。 2&#xff09; 在棧上創建。在執行函數時&#xff0c;函數內局部變量的…

Spring3.1.0+Quartz1.8.6整合實現計劃任務

1.首先要加入任務計劃的相關的jar包&#xff0c;這里除了需要加Spring3.1.0的jar&#xff0c;還需要加quartz-all-1.8.6.jarslf4j-api-1.5.8.jar slf4j-log4j12.jar這三個包&#xff0c;如果你是SSH整合的項目&#xff0c;里面有下面的兩個包了&#xff0c;就可以不加&#xff…

百戰c++(7)

40. 鏈表題&#xff1a;一個鏈表的結點結構 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel) Node * ReverseList(Node *head) //鏈表逆序 { if ( head NULL || head->next NU…

數組的轉置和軸對稱

文章目錄T屬性transpose()方法swapaxes()方法T屬性 import numpy as np # Numpy工具包data np.arange(12).reshape(3, 4) # 創建一個3行4列的數組 print(data)# 數組的轉置和軸對稱 data1 data.T print(data1)print(data) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] print(dat…

百戰c++(8)

43. 寫一個在一個字符串(n)中尋找一個子串(m)第一個位置的函數。 KMP算法效率最好&#xff0c;時間復雜度是&#xff2f;(nm)。 44. 多重繼承的內存分配問題&#xff1a; 比如有class A : public class B, public class C {} 那么A的內存結構大致是怎么樣的&#xff1f; 這…

管道實現父子進程的信息傳遞(一)【fork函數、pipe函數、write/read操作、wait函數】

文章目錄題目描述代碼實現關于pipe函數關于讀寫操作關于讀寫端口關于wait函數功能&#xff1a;注意&#xff1a;關于fork函數題目描述 編寫一個程序&#xff0c;利用管道實現父子進程的通信&#xff0c;父進程向子進程發送信息&#xff0c;由子進程輸出顯示。 代碼實現 #inclu…

基礎的shell編程問題(一)

文章目錄題目一題目描述代碼實現關于$#的有關內容實測本程序的作用題目二題目描述代碼實現注釋關于argc、argv關于read函數關于文件描述符關于write函數本程序的作用題目三題目描述代碼實現實測關于grep命令關于read命令題目四題目描述代碼實現關于test命令實測題目一 題目描述…