排序之 冒泡,直接插入,選擇排序

2021-08-02 18:22:10 字數 3042 閱讀 8923

學過程式設計的應該都知道,排序演算法有很多種,想把每種演算法的基本思想搞懂弄清確實得下一番功夫,今天我先介紹幾種簡單的,氣泡排序,直接插入排序和選擇排序,一定要弄清楚每種方法基本思想的差異。

1,氣泡排序(公升序)

基本思想:

相鄰的兩個元素進行比較,如果前乙個元素大於後乙個元素,則交換二者位置,接著繼續向後迴圈比較直到最後乙個元素,這樣一趟下來就可以將最大的那個元素放到最後的位置。完成之後,進行第二趟排序,迴圈比較直到倒數第二個元素,就可以將第二大元素放於倒數第二個位置......迴圈以上步驟,直到迴圈比較到原陣列的最後兩個元素,目的就達到了,下面用圖進行進一步說明。

****以上則是第一趟排序後的結果,由圖可知,經過一趟冒泡後,最大的元素出現在了它最終該出現的位置。

****以此類推,最

後一趟排序過程為:

**** 比較以上三幅圖,我們可知道含六個元素的陣列第一趟冒泡需要5次比較,第二趟需要4次交換比較,以此類推,我們可以總結出

含n個元素的一組數總共需要n-1(i)趟排序,每趟排序需要比較n-1-i(j)次。

下面看一下**實現:

的確,達到了我們排序的結果,但是,殊不知我們做了很多不必要的工作,下面用乙個例子來說明這個問題。

下面我們就來看看優化後的**:

#define _crt_secure_no_warnings 1  

#include#includevoid bubble_sort(int arr,int sz)  

}  if(flag==0)  

}  }  int main()  

;      int i=0;  

int sz=sizeof(arr)/sizeof(arr[0]);  

bubble_sort(arr,sz);  

for(i=0; i

通過上面的優化後,你能不能想到其他的優化方法呢?動腦筋思考一下,我是這樣想的  

#include#includevoid bubble_sort(int arr,int sz)  

}  if(flag==0)  

k=pos;  

}  }  int main()  

;    int i=0;  

int sz=sizeof(arr)/sizeof(arr[0]);  

bubble_sort(arr,sz);  

for(i=0; i

2.直接插入排序

基本思想:將需要排序的元素分為兩部分,第一部分預設已經是有序序列(第一次分割時這部分僅為第乙個元素),第二部分依次向後迴圈每個元素,將迴圈到的元素乙個乙個插入到第一部分的適合位置,當第二部分的所有元素迴圈完畢時,演算法結束,此時排序成功!

#includevoid insert_sort(int arr,int sz)  

}  for(k=i-1; k>j; k--)//將需要插入的位置以後的元素向後移,為插入元素留出空位  

arr[j+1]=tmp;//將需要插入的元素插入相應位置  

}  }  int main()  

;    int i=0;  

int sz=sizeof(arr)/sizeof(arr[0]);  

insert_sort(arr,sz);  

for(i=0; i

仔細斟酌一下,可以發現裡面的兩層迴圈可以合二為一

#includevoid insert_sort(int arr,int sz)  

arr[j+1]=tmp;  

}  }  int main()  

;    int i=0;  

int sz=sizeof(arr)/sizeof(arr[0]);  

insert_sort(arr,sz);  

for(i=0; i

3.選擇排序

基本思想:與插入排序一樣,選擇排序也是講排序陣列分為兩部分,不同之處在於比較時總是拿第二部分的最小元素和第一部分的最後乙個元素進行比較交換

#includevoid choose_sort(int arr,int sz)  

{   int i=0;//控制假定有序的部分  

int j=0;//找出無序部分的最小元素  

int min=0;//無序部分的最小元素的下標  

for(i=0; i到這裡,這三種演算法的思想應該清楚了,永遠記住一句話:

演算法是程式的靈魂!

排序(冒泡 直接插入 選擇)

從小到大 int j,temp for int i 0 i arr.length 1 i else if j將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表,再從剩下的關鍵字中選取下乙個插入物件 for int i 0 i arr.length i arr j temp co...

氣泡排序 選擇排序 直接插入排序 希爾排序

冒泡法排序思路如下 如下 void bubblesort int arr,int len if swap swap false 如果已經有序則跳出迴圈,不再進行比較。時間複雜度 無序 o n 2n 2 n2 有序 o nnn 空間複雜度 o 111 穩定性 穩定 選擇排序思路如下 從待排序數字開始,...

排序之直接插入排序

直接插入排序 straight insertion sort 的作法是 每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。具體步驟如下 初始序列 i 1 46 58 15 45 90 18 10 62 i 2 46 58 15 45 90 18 10 62 i 3 15 4...