生活随笔
收集整理的這篇文章主要介紹了
十种基本排序算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
十種基本排序算法
文章目錄
- 十種基本排序算法
- 一、復雜度分析
- 二、實現
- 插入排序
- 希爾排序
- 選擇排序
- 堆排
- 冒泡排序
- 快速排序hoare版本
- 快速排序挖坑版本
- 快速排序雙指針版本
- 快排非遞歸版本
- 歸并排序
- 計數排序
一、復雜度分析
二、實現
插入排序
class Solution {
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}for(size_t i
= 0;i
< nums
.size() - 1;i
++){int end
= i
;int temp
= nums
[end
+ 1];while(end
>= 0 && nums
[end
] > temp
){nums
[end
+ 1] = nums
[end
];end
--;}nums
[end
+ 1] = temp
;}return nums
;}
};
希爾排序
class Solution {
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}int gap
= nums
.size();while(gap
> 1){gap
= gap
/ 3 + 1;for (int i
= 0; i
< nums
.size() - gap
;++i
){int end
= i
;int temp
= nums
[end
+gap
]; while (end
>= 0 && nums
[end
] >temp
){nums
[end
+ gap
] = nums
[end
];end
-= gap
;} nums
[end
+ gap
] = temp
; } }return nums
;}
};
選擇排序
class Solution {
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}int begin
= 0;int end
= nums
.size() - 1;while(begin
< end
){int max_data_index
= begin
;int min_data_index
= begin
;for(int i
= begin
;i
<= end
;i
++){if(nums
[max_data_index
] < nums
[i
]){max_data_index
= i
;}if(nums
[min_data_index
] > nums
[i
]){min_data_index
= i
;}}swap(nums
[begin
],nums
[min_data_index
]);if(max_data_index
== begin
){max_data_index
= min_data_index
;}swap(nums
[end
],nums
[max_data_index
]);begin
++;end
--;}return nums
;}
};
堆排
class Solution {
public:void AdjustDown(vector
<int>& nums
,int begin
){int parent
= begin
;int child
= parent
* 2 + 1;while(child
< nums
.size()){if(child
+ 1 < nums
.size() && nums
[child
] < nums
[child
+ 1]){child
= child
+ 1;}if(nums
[child
] > nums
[parent
]){swap(nums
[child
],nums
[parent
]);parent
= child
;child
= parent
* 2 + 1;}else {break;}}}vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}for(int i
= (nums
.size() - 1 - 1) / 2;i
>= 0;i
--){AdjustDown(nums
,i
);}int end
= nums
.size() - 1;vector
<int> ret(nums
.size());while(end
> 0){swap(nums
[0],nums
[end
]);ret
[end
] = nums
[end
];nums
.pop_back();AdjustDown(nums
,0);end
-- ;}ret
[0] = nums
[0];return ret
;}
};
冒泡排序
class Solution {
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}bool flag
= true;for(size_t i
= nums
.size();i
> 0;i
--){for(size_t j
= 1;j
< i
;j
++){if(nums
[j
- 1] > nums
[j
]){flag
= false;swap(nums
[j
- 1],nums
[j
]);}}if(flag
){break;}}return nums
;}
};
快速排序hoare版本
class Solution {
public:int GetMidIndex(vector
<int>& nums
, int begin
, int end
){int mid
= begin
+ (end
- begin
) / 2;if(nums
[begin
] < nums
[mid
]){if(nums
[mid
] < nums
[end
]){return mid
;}else if(nums
[begin
] > nums
[end
]){return begin
;}else {return end
;}}else {if(nums
[mid
] > nums
[end
]){return mid
;}else if(nums
[begin
] < nums
[end
]){return begin
;}else {return end
;}}}int PartSort(vector
<int>& nums
, int begin
, int end
){int mid
= GetMidIndex(nums
,begin
,end
);swap(nums
[mid
],nums
[begin
]);int key
= nums
[begin
];int start
= begin
;while(begin
< end
){while(begin
< end
&& nums
[end
] >= key
){end
--;}while(begin
< end
&& nums
[begin
] <= key
){begin
++;}swap(nums
[begin
],nums
[end
]);}swap(nums
[start
],nums
[begin
]);return begin
;}void QuickSort(vector
<int>& nums
, int left
, int right
){if(left
>= right
){return ;}{int mid
= PartSort(nums
,left
,right
);QuickSort(nums
,left
,mid
- 1);QuickSort(nums
,mid
+ 1,right
);}}vector
<int> sortArray(vector
<int>& nums
) { if(nums
.empty()){return {};}QuickSort(nums
,0,nums
.size() - 1);return nums
; }
};
快速排序挖坑版本
class Solution {
public:int GetMidIndex(vector
<int>& nums
, int begin
, int end
){int mid
= begin
+ (end
- begin
) / 2;if(nums
[begin
] < nums
[mid
]){if(nums
[mid
] < nums
[end
]){return mid
;}else if(nums
[begin
] > nums
[end
]){return begin
;}else {return end
;}}else {if(nums
[mid
] > nums
[end
]){return mid
;}else if(nums
[begin
] < nums
[end
]){return begin
;}else {return end
;}}}int PartSort(vector
<int>& nums
, int begin
, int end
){int mid
= GetMidIndex(nums
,begin
,end
);swap(nums
[mid
],nums
[begin
]);int key
= nums
[begin
];while(begin
< end
){while(begin
< end
&& nums
[end
] >= key
){end
--;}nums
[begin
] = nums
[end
];while(begin
< end
&& nums
[begin
] <= key
){begin
++;}nums
[end
] = nums
[begin
];}nums
[begin
] = key
;return begin
;}void QuickSort(vector
<int>& nums
, int left
, int right
){if(left
>= right
){return ;}{int mid
= PartSort(nums
,left
,right
);QuickSort(nums
,left
,mid
- 1);QuickSort(nums
,mid
+ 1,right
);}}vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}QuickSort(nums
,0,nums
.size() - 1);return nums
; }
};
快速排序雙指針版本
class Solution {
public:int GetMidIndex(vector
<int>& nums
, int begin
, int end
){int mid
= begin
+ (end
- begin
) / 2;if(nums
[begin
] < nums
[mid
]){if(nums
[mid
] < nums
[end
]){return mid
;}else if(nums
[begin
] > nums
[end
]){return begin
;}else {return end
;}}else {if(nums
[mid
] > nums
[end
]){return mid
;}else if(nums
[begin
] < nums
[end
]){return begin
;}else {return end
;}}}int PartSort(vector
<int>& nums
, int begin
, int end
){int key
= nums
[end
];int prev
= begin
- 1;int cur
= begin
;while(cur
< end
){if(nums
[cur
] < key
){prev
++;swap(nums
[cur
],nums
[prev
]);}cur
++;}swap(nums
[end
],nums
[++prev
]);return prev
;}void QuickSort(vector
<int>& nums
, int left
, int right
){if(left
>= right
){return ;}{int mid
= PartSort(nums
,left
,right
);QuickSort(nums
,left
,mid
- 1);QuickSort(nums
,mid
+ 1,right
);}}vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}QuickSort(nums
,0,nums
.size() - 1);return nums
; }
};
快排非遞歸版本
class Solution {
public:int PartSort(vector
<int>& nums
, int begin
, int end
){int key
= nums
[end
];int prev
= begin
- 1;int cur
= begin
;while(cur
< end
){if(nums
[cur
] < key
){prev
++;swap(nums
[cur
],nums
[prev
]);}cur
++;}swap(nums
[end
],nums
[++prev
]);return prev
;}void QuickSortStack(vector
<int>& nums
, int left
, int right
){stack
<int> s
;if(left
< right
){s
.push(right
);s
.push(left
);}while(!s
.empty()){left
= s
.top();s
.pop();right
= s
.top();s
.pop();int mid
= PartSort(nums
,left
,right
);if(left
< mid
- 1){s
.push(mid
- 1);s
.push(left
);}if(right
> mid
+ 1){s
.push(right
);s
.push(mid
+ 1);}}}vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}QuickSortStack(nums
,0,nums
.size() - 1);return nums
;}
};
歸并排序
class Solution {void mergeSort(vector
<int>& nums
, int left
, int right
,vector
<int>& tmp
) {if (left
>= right
) return;int mid
= (left
+ right
) >> 1;mergeSort(nums
, left
, mid
,tmp
);mergeSort(nums
, mid
+ 1, right
,tmp
);int begin1
= left
;int end1
= mid
;int begin2
= mid
+ 1;int end2
= right
;int index
= left
;while (begin1
<= end1
&& begin2
<= end2
) {if (nums
[begin1
] < nums
[begin2
]) {tmp
[index
++] = nums
[begin1
++];}else {tmp
[index
++] = nums
[begin2
++];}}while (begin1
<= end1
){tmp
[index
++] = nums
[begin1
++];} while (begin2
<= end2
){tmp
[index
++] = nums
[begin2
++];} for (int i
= 0; i
< right
- left
+ 1; ++i
) nums
[i
+ left
] = tmp
[i
+ left
];}
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}vector
<int> tmp(nums
.size());mergeSort(nums
, 0, (int)nums
.size() - 1,tmp
);return nums
;}
};
計數排序
class Solution {
public:vector
<int> sortArray(vector
<int>& nums
) {if(nums
.empty()){return {};}map
<int,int> mp
;for(size_t i
= 0;i
< nums
.size();i
++){mp
[nums
[i
]]++;}nums
.clear();for(auto e
: mp
){for(int i
= 0;i
< e
.second
;i
++){nums
.push_back(e
.first
);}}return nums
;}
};
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的十种基本排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。