C语言算法——实现冒泡排序
生活随笔
收集整理的這篇文章主要介紹了
C语言算法——实现冒泡排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C語言算法——排序算法
- 1、冒泡排序
- 2、插入排序
- 3、選擇排序
1、冒泡排序
#include <stdio.h> int main ( ) {//冒泡排序int a[]={3,2,6,4,8,9,1,0,3,5,7,1};int len=sizeof(a)/sizeof(int);//求出數組中元素的個數 // printf("%d\n",len);int i=0,j;for (; i<len-1; i++) { //n個元素進行冒泡排序需要進行n-1次循環for (j=0; j<len-1-i; j++) { //每次循環完一次,最大的數就在最后,所以每進行一次循環后面的那幾個數就不需要參與循環,所以i<len-i-1if (a[j]>a[j+1]) {//實現元素的交換int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}for (i=0; i<len; i++) {printf("%d ",a[i]);}printf("\n"); }2、插入排序
默認數組中的第一個數是原本數組中排好序的第一個數,然后每次將排好序的數組的后面的第一個數作為哨兵。每次哨兵都和前面的排好序的數組中的數從后往前進行比較,然后將哨兵插入到已經排好序的數組中。然后哨兵逐漸往后移動,逐步將哨兵插入到數組中,這就是插入排序的整體思路和步驟。
#include <stdio.h> int main() {int arr[6]={4,6,1,2,8,7};int n = sizeof(arr)/sizeof(int); //求出數組的長度int i,j,k;for (i=1; i<n; i++) {k = arr[i]; //哨兵,從數組中的第二個元素開始進行存儲,每一次往后移動一位進行儲存,將這個數插入到前面已經排好序的數組中。j=i-1; //已經排好序的數組的最后一個元素的下標。while(j>=0 && k<arr[j]){ //每次哨兵和前面排好序的數組中的元素從后往前進行比較,找到哨兵要插入的位置。arr[j+1]=arr[j]; //為哨兵騰出位置,以便于將哨兵插入數組中合適的位置。j--; //用j記錄最終哨兵要插入的位置。}arr[j+1] = k; //將哨兵插入到數組合適的位置(形成一個新的排好序的數組)}for (i=0; i<n; i++) {printf("%d ",arr[i]);}printf("\n"); }3、選擇排序
說明:動圖來自與此鏈接,點擊我直接進入,感謝博主的分享
說明:動圖來自與此鏈接,點擊我直接進入,感謝博主的分享
思路:
每次從待排序列中選出一個最小值,然后放在序列的起始位置,直到全部待排數據排完即可。
實際上,我們可以一趟選出兩個值,一個最大值一個最小值,然后將其放在序列開頭和末尾,這樣可以使選擇排序的效率快一倍。
方案一:只找最小的值,將最小的值往前移
#include <stdio.h> int main() {int a[]={2,9,5,0,1,3,6,8};int n = sizeof(a)/sizeof(int);//求出數組a的長度 // printf("%d\n",n);int begin=0,end=n-1;while (begin<end) {int min=a[begin];//min用于存儲數組中元素的最小的值int t=begin;//t表示的是數組中最小數的下標for(int i=begin ; i<end;i++){if (min>a[i]) {min=a[i];t = i;}}a[t]=a[begin];a[begin] = min;begin++;}int i = 0;for (; i<n; i++) {printf("%d ",a[i]);}printf("\n"); }方案二:找最小值和最大值,最小值往前移,最大值往后移
#include <stdio.h> int main() { // 思路: // 每次從待排序列中選出一個最小值,然后放在序列的起始位置,直到全部待排數據排完即可。 // 實際上,我們可以一趟選出兩個值,一個最大值一個最小值,然后將其放在序列開頭和末尾,這樣可以使選擇排序的效率快一倍。int a[]={2,9,5,0,1,3,6,8};int n = sizeof(a)/sizeof(int);//求出數組a的長度 // printf("%d\n",n);int begin=0,end=n-1;//begin表示數組的第一個元素,end表示數組的最后一個元素。int x=0,y=0; //x,y分別記錄數組中最大值、最小值的數的下標。while(begin<end){int min = a[begin],max = a[begin];//先將數組中的第一個元素作為最大值和最小值(因為我們也不知道最大值最小值在哪)//使用for循環遍歷數組,每一找到數組中的最大值和最小值賦值給max和min。int i=begin;for (; i<=end; i++) {if (a[i]>max) {max=a[i];x=i; //記錄所查找范圍內最大數的下標}if (a[i]<min) {min=a[i];y=i; //記錄所查找范圍內最小數的下標}}//將數組中最大數的下標和end下標的數值進行交換a[x]=a[end];a[end] = max;//將數組中最小數的下標和begin下標的數值進行交換a[y]=a[begin];a[begin] = min;//此時最左邊和最右邊已經存儲了最小值和最大值,所以begin要往后移動,end要往前移動,在這個新的begin和end的范圍內再進行選擇排序++begin;end--;}int i=0;for (i=0; i<n; i++) {printf("%d ",a[i]);}printf("\n"); }總結
以上是生活随笔為你收集整理的C语言算法——实现冒泡排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [和秋叶一起学ppt]四步做好段落排版(
- 下一篇: 电影网站php源码