十大常規排序演算法Ⅰ
阿新 • • 發佈:2020-12-09
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; }