這篇博文主要用於自己學習的文章梳理,方便以後回憶。
first,氣泡排序, 演算法的時間複雜度是n*n ,在資料較多的時候,和快速排序比較執行時間,簡直慢的掉渣,
氣泡排序的思想,主要是相鄰兩個元素比較,如果前乙個元素比後乙個元素大,則進行交換,否則繼續後移,知道一次迴圈結束,此時最後乙個元素是序列中最大的元素。
每乙個趟將乙個元素像冒泡一樣冒出,進行n-1此迴圈後,序列有序。
氣泡排序主要兩個for迴圈的邊界。
void bubble(int *a,int len)
} }}
second,插入排序。
插入排序的主要思想是假設初始序列只有乙個元素,這個元素肯定有序,每次向序列裡插入乙個元素,找到元素合適的位置,然後進行插入。
插入排序的核心部分就是找到該元素合適的位置。
可以將帶插入的元素和 有序序列最後比較,如果比最後乙個元素大,直接插入最後乙個元素後面,如果比最後乙個元素小,則將最後乙個元素後移,知道找到合適的位置停止。
最後將待插入的元素插入到適當的位置上。
void insert(int *a,int len)
else //大於當前元素 停止內迴圈
}a[j+1]=temp;
}}
third,選擇排序,正如這種排序的名字一樣,每次遍歷非有序的序列,找出最小元素,放入到合適的位置上。
初始假設第乙個元素有效,然後與第乙個元素後面的每個元素比較,每找到比此元素小的元素,進行交換,一趟迴圈後,初始元素肯定是最小的。
然後依次類推,排序後面的元素。
void select(int *a,int len)
} }}
fourth,快速排序, 乙個優秀的排序,還是有點回答不上來當時導師問的那個問題,為什麼快速排序比別的排序要快?
只能說一下演算法的大概思想了,讓導師失望了,找到乙個pivot,然後通過比較後,使pivot前面的元素比它小,後面的元素比它大, 然後對前半段和後半段遞迴的呼叫程式,
int quicksort(int *a,int low,int high)
a[i] = a[j];
while((a[i] <= temp) && (i < j))
a[j]= a[i];
} a[i] = temp;
// quicksort(a,low,i-1);
// quicksort(a,j+1,high); //遞迴呼叫函式
} return i; //分割點 i=j;
}
最後 。通過快速排序 ,產生了乙個元素序列的劃分,想一下,如果在倒數第十個元素前面的都比它小,後面的都比他大,則後面的十個元素就是最大的元素,則不需要每次遍歷整個序列找出最大元素輸出。
下面的**是找到列印最大k個元素的的起點。
int find_top(int *a,int len,int count)
else
}return part;
}
最後放上測試**:
#include "superman.h"
int main(int argc,char *argv)
{ int i,n=1;
int part;
int test[size];
//int *test=(int *)calloc(size,sizeof(int));
//srand(time(null));
for(i=0;i
氣泡排序 選擇排序 插入排序 快速排序
include 氣泡排序,思想 從最末位開始 往前一位一位比較,比前一位小的話,就交換位置 兩個for,第乙個for迴圈用於記錄已排序的位置,第二個for迴圈用於已排序位置到結束位置之間的氣泡排序 void popsort int p int n 選擇排序,由前往後選擇最小的數。一輪比較完後,將最小...
氣泡排序 選擇排序 插入排序 快速排序
氣泡排序 元素兩兩比較,大的往後放,經過一輪比較後,那麼最大的元素就會出現在最後面。public static void main string args for int j 0 j arr i 1 system.out.println arrays.tostring arr 每次拿乙個元素,跟他後...
氣泡排序 選擇排序 快速排序 插入排序
排序只對一維資料有意義.兩層迴圈,第一層是遍歷每乙個元素.第二層迴圈,讓兩兩之間進行比較交換.時間複雜度 o n 2 空間複雜度 o 1 穩定性 穩定的 def buble sort arr for i in range len arr 1 for j in range len arr i 1 if...