1. 程式人生 > 其它 >十大常規排序演算法Ⅰ

十大常規排序演算法Ⅰ

技術標籤:面試演算法題排序演算法

voidSwap(int*a,int*b)  //交換兩個數
{
inttemp=*a;
*a=*b;
*b=temp;
}


1、氣泡排序


描述:
①比較相鄰的原始,如果第一個比第二個大就交換兩個數。
②從第一對到結尾的最後一對執行①的操作,這樣最後的元素已經排序成功。
③在剩下序列中,對所有元素重複①②的操作,
④以此執行①②③直到剩下的序列元素為0

複雜程度:
時間複雜度O(n^2) 空間複雜度O(1)

//引數:指標 陣列大小 返回大小
//返回:指標

//陣列 氣泡排序(陣列,陣列大小,返回大小)
int*Bubblesort(int*nums,intnumsSize,int*returnSize){
*returnSize=numsSize;
if(numsSize==0||numsSize==1)
{
returnnums;
}
for(inti=0;i<numsSize;i++){
for(intj=1;j<numsSize-i;j++)
{
if(nums[j-1]>nums[j]){
Swap(&nums[j],&nums[j-1]);  //交換資料
}
}
}
returnnums;
}


2、選擇排序


描述:
①初始狀態:有序區為空,無序區為0-[n-1]。
②從無序區0-[n-1]中找到最小元素的位置i,交換[i]區和無序區的首區。此時:有序區為[0],無序區為1-[n-1]
③重複執行②n-1次以後,陣列就有序化了

複雜程度:
時間複雜度O(n^2) 空間複雜度O(1)

int*Selectionsort(int*nums,intnumsSize,int*returnSize){
*returnSize=numsSize;
if(numsSize==0||numsSize==1)
{
returnnums;
}
for(inti=0;i<numsSize;i++){
intMin=i;
for(intj=i;j<numsSize;j++)
{
if(nums[j]<nums[Min]){
Min=j;
}
}
Swap(&nums[i],&nums[Min]);
}
returnnums;
}

3、插入排序


描述:
①初始狀態:有序區為0,無序區為1-[n-1]。
②取下無序區首元素,在已經排列好的元素序列中從後往前掃描
③如果該元素(已排列)大於新元素,將該元素後移。
④重複執行③操作,直到找到一個小於或等於新元素的位置
⑤將新元素插入該位置。
⑥重複執行②~⑤,直到無序區為空

時間複雜度O(n^2) 空間複雜度O(1)

void InsertSort(int *arry,int numsSize)
{
*returnSize=numsSize;
if(numsSize==0||numsSize==1)
{
returnnums;
}
for(inti=1;i<numsSize;i++){
intkey=nums[i],count=i; //儲存新資料
while(count-1>=0&&nums[count-1]>key) 
{
nums[count]=nums[count-1]; //老資料後移
count--;
}
nums[count]=key;    //新資料位置賦值
}
returnnums;
}