C语言入门——排序
排序的方法有很多種比較常見的便為:冒泡排序、選擇排序、插入排序、快速排序。
今天我們就圍繞著四種排序來說,如果有興趣的話可以去查找一下其他排序。
在排序這方面我們主要討論:
- 穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不穩定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現在 b 的后面。
- 時間復雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什么規律。
- 空間復雜度:是指算法在計算機
一、冒泡排序
冒泡排序是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
算法描述:冒泡排序主要比較相鄰元素之間大小,從第一個元素開始比較,將較大的元素不斷向后移動,然后重復此操作,注意最后一個元素不需此操作。
算法演示圖:
代碼實現:
void bulletSort(int arr[], int len)//冒泡排序 {int temp = 0;//作為交換的中間變量for (int i = 0; i < (len - 1); i++){for (int j = 0; j <( len-i-1); j++){if (arr[j]>arr[j + 1]){temp = arr[j+1];arr[j + 1] = arr[j];arr[j] = temp;}}} }二、選擇排序
選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
算法描述:定義一個變量min,然后從數組中找到最小值賦值給min,然后交換a[i]與min的值。
算法演示圖:
void selectSort(int arr[], int len) {int min;int temp = 0;for (int i = 0; i < len - 1; i++){min = i;for (int j = i + 1; j < len; j++){if (arr[j]<arr[min])min = j;}temp = arr[i];arr[i] = arr[min];arr[min] = temp;} }三、插入排序
插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。
算法描述:從第一個元素開發就已被標記,然后將后面一個作為交換元素,將如果后面一個元素小于前面一個元素的話,那么將元素不斷的向左邊移動。
算法演示圖:
代碼實現:
void insertSort(int arr[], int len) {int temp = 0;int j = 0;for (int i = 1; i < len; i++){j = i - 1;temp = arr[i];while(j >= 0 && arr[j]>temp){arr[j+1] = arr[j];j--;}arr[j + 1] = temp;} }四快速排序:
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
算法描述:前面的三種排序相對于簡單,后面這一種快速排序就得浪費點腦力了,快速排序由C. A. R. Hoare在1962年提出。快速排序是對冒泡排序的一種改進,采用了一種分治的策略。通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
算法演示圖:
代碼實現:
void quickSort(int arr[], int left, int right) {if (left >= right)return;int i = left, j = right, temp;while (i < j){while (i < j&&arr[left] < arr[j])j--;while (i<j&&arr[left]>=arr[i])i++;if (i < j){temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//跳出循環則說明i==jtemp = arr[left];arr[left] = arr[i];arr[i] = temp;quickSort(arr, left, i - 1);quickSort(arr, i+1, right); }如果大家想了解更多C語言知識的話可以關注我,或者來加入我們的公眾號:C語言進階之旅? 希望各位都能收獲到更多的C語言知識,在編程這條道路上越走越遠!!!
總結
- 上一篇: 华为交换机S3700端口基本配置
- 下一篇: 安装codeblocks和wxwidge