世界を支配する上位10のアルゴリズム:
- マージソート、クイックソート、ヒープソート
- フーリエ変換と高速フーリエ変換
- ダイクストラのアルゴリズム
- RSA非対称暗号化アルゴリズム
- ハッシュセキュリティアルゴリズム(Secure Hash Algorithm)
- 整数分解アルゴリズム(整数分解)
- リンク分析アルゴリズム(リンク分析)
- 比例計算アルゴリズム
- データ圧縮アルゴリズム
- 乱数生成アルゴリズム
3つの単純なソートアルゴリズム(時間の複雑さO(n ^ 2))
(1)直接挿入ソート
ソートされたサブファイルの適切な位置に各レコードを順番に挿入しますが、挿入されたファイルは引き続き適切です。安定したソートアルゴリズム、時間の複雑さO(n ^ 2)。
class Solution {
//直接插入排序
public int[] sortArray(int[] nums) {
int temp=0;
for(int i=0;i<nums.length-1;i++){
temp=nums[i+1]; //暂存第i+1个值,将其插入合适的位置
int j=i;
while(j>=0 && nums[j]>temp){
nums[j+1]=nums[j];
j--;
}
nums[j+1]=temp;
}
return nums;
}
}
(2)直接選択とソート
不安定な並べ替えアルゴリズム。すべてのレコードの中でキーワードが最小のレコードを選択し、それを格納場所の最初のレコードと交換してから、残りのレコードの中でキーワードが最小のレコードと2番目のレコードを選択します。保管場所を交換します。以下同様に、すべてのレコードが順序付けられたシーケンスになるまで。(n-1回ソート)
class Solution {
//直接选择排序
public int[] sortArray(int[] nums) {
for(int i=0;i<nums.length;i++){ //选第i大的元素放到第i个位置
int small=i;
for(int j=i+1;j<nums.length;j++){
if(nums[j]<nums[small])
small=j;
}
if(small!=i)
swap(nums,i,small);
}
return nums;
}
public void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
(3)バブルソート
アイデア:常に2つの隣接するレコードを比較します。ソート要件が満たされない場合は、n-1番目のレコードがn番目のレコードと比較されて交換されるまで、隣接するレコードを交換して、バブルソートを完了します、最大のキーワードを持つレコードが最後の位置に配置されるようにします。次に、最初のn-1レコードに対して、n-1パスが実行されるまで同じ操作が実行されます。
class Solution {
//冒泡排序,O(n^2)
public int[] sortArray(int[] nums) {
int flag=1;
for(int i=1;i<nums.length && flag==1;i++){ //循环n-1次
flag=0;
for(int j=0;j<nums.length-i;j++){
if(nums[j]>nums[j+1]){
flag=1;
swap(nums,j,j+1);
}
}
}
return nums;
}
public void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
3つの単純なソートアルゴリズムの比較
直接挿入ソート | 直接選択ソート | バブルソート | ||||
---|---|---|---|---|---|---|
よりキーワード 回以上 | レコードの移動の 移動回数 | よりキーワード 回以上 | レコードの移動の 移動回数 | よりキーワード 回以上 | レコードの移動の 移動回数 | |
ベスト(正の順序) | O(n) | O(n) | O(n2) | 0 | O(n) | 0 |
最悪(逆順) | O(n2) | O(n2) | O(n2) | O(n) | O(n2) | O(n2) |
平均 | O(n2) | O(n2) | O(n2) | O(n) | O(n2) | O(n2) |
平均時間の複雑さ | O(n2) | O(n2) | O(n2) | |||
スペースの複雑さ | O(1) | O(1) | O(1) |