面試必考排序,所以按自己的**風格,寫了寫6個常見的排序,方便看。
插入排序的基本思想就是每次將待插入元素按索引大小插入到前面已經排好序的子串行中。
void
insertsort
(int
*a,int n)
//公升序
a[j +1]
= temp;}}
intmain()
;insertsort
(a,sizeof
(a)/
sizeof
(int))
;for
(int elem : a)
system
("pause");
return0;
}
平均時間複雜度顯然為o(n2)
空間複雜度為o(1)
若要降序只需要修改乙個地方即可:while (j >= 0 && temp > a[j])
void
bubblesort
(int
*a,int n)
//公升序}if
(flag ==0)
//本趟遍歷沒有發生交換,說明排序已經完成
return;}
}
平均時間複雜度顯然為o(n2)
空間複雜度為o(1)
void
selectsort
(int
*a,int n)
//公升序
}swap
(a[k]
,a[i-1]
);}}
平均時間複雜度顯然為o(n2)
空間複雜度為o(1)
核心就是partition函式,對於partition函式,我的總結:
樞軸為low時,low的左邊始終是比a[low]小的;
樞軸為high時,high的右邊始終是比a[high]大的;
int
partition
(int a,
int low,
int high)
//選第乙個元素為樞軸
return low;
//返回樞軸的下標
}void
quicksort
(int a,
int low,
int high)
}
對有序序列使用快排是最壞的,時間複雜度為o(n2)
平均時間複雜度為o(nlogn)
平均空間複雜度為o(logn)。因為在前行階段,對於每一層遞迴,函式的區域性變數、引數值以及返回位址都被壓入棧中。在退回階段,位於棧頂的區域性變數、引數值以及返回位址被彈出。所以遞迴工作棧的容量要與遞迴呼叫的最大深度一致。最壞情況下,要進行n-1次遞迴,棧的深度為o(n)。
典型的dfs
//歸併排序
void
merge
(vector<
int>
&data,
int start,
int mid,
int end)
}//若second_start先到了後半段末尾
while
(first_start <= mid)
temp[copy_start++
]= data[first_start++];
//若first_start先到了前半段末尾
while
(second_start <= end)
temp[copy_start++
]= data[second_start++];
for(
int i = start; i <= end; i++
) data[i]
= temp[i];}
void
mergesort
(vector<
int>
&data,
int start,
int end)
時間複雜度:每一趟歸併(merge)的時間複雜度為o(n),共需進行logn趟歸併,所以總的時間複雜度為o(nlogn)
空間複雜度為o(n)
首先要強調的是:堆是乙個完全二叉樹!從1開始編號!
我覺得我以前寫的堆排序講得很清楚了,很好理解思路。本質就是兩步:
1.構造初始大頂堆:從下往上、從右到左,將每個非葉子結點作為根結點,將其和其子樹調整成大頂堆。
2.將根結點與堆陣列的末尾元素交換,此時末尾元素就是最大值。然後將剩餘的n-1個序列重新調整為乙個大頂堆,這樣就可以得到次大值。如此反覆執行,最終就可以得到乙個有序序列。
這裡額外補充一點:
刪除堆頂元素時,先將堆頂元素和堆的最後乙個元素交換,然後重新調整堆(原先堆的大小為n,注意,調整的時候為n-1);
對堆進行插入時,先將新結點放在堆的末端,然後重新調整堆(原先堆的大小為n,注意,調整的時候為n+1);
堆排序的時間複雜度:o(nlogn)
空間複雜度為o(1)
JAVA基礎 6種常用排序演算法
各種排序的時間 空間複雜度 穩定性是指排序中 相同的數在排序前後,他們的 相對位置不會發生改變。1.直接插入排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個...
6種排序模板
看幾個動畫演示 穩定的排序有 冒泡 插入 歸併 一 氣泡排序 o n n 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會...
6種排序演算法
氣泡排序 選擇排序 歸併排序 快速排序 堆排序插入排序,顧名思義肯定是已插入為主,將待排序的陣列分為已排序 陣列前部分 和未排序 陣列後部分 這裡我們已從小到大排序,陣列為num 0 end 剛開始排序時,固定第乙個數num 0 為已經排序好的數,從第二個數num 1 開始,從後往前比較已排序中的資...