7个常用的排序算法
1.冒泡排序
void BubbleSort1(vector<int> &x){
int n = x.size();
for(int i=0;i<n;i++){
for(int j = i+1;j<n;j++){
if(x[i]>x[j]){
swap(x[i],x[j]);
}
}
}
}
2.直接选择排序
void SelectSort(vector<int> &x){
int min_number = 0;
int i,j;
for(i = 0;i<x.size();i++){
min_number = i;
for(j = i+1;j<x.size();j++){
if(x[j]<x[min_number]){
min_number = j;
}
}
if(min_number!=i){
swap(x[min_number],x[i]);
}
}
}
3. 直接插入排序
void InsertSort(vector<int> &x){
int flag = 0;
for (int i = 1; i < x.size(); ++i) {
flag = i;
for(int j = i-1;j>=0;j--){
if(x[j]>x[flag]){
swap(x[j],x[flag]);
}
flag--;
}
}
}
4. 希尔排序
void ShellSort(vector<int> &x){
int increment = x.size();
while(increment>0){
increment = increment/2;
for(int i = 0;i<increment;i++){
for(int j = increment+i;j<x.size();j+=increment){
int k = j;
while(k>=increment&&(x[k]<x[k-increment])){
swap(x[k],x[k-increment]);
k-=increment;
}
}
}
}
}
5. 最大堆排序
void HeadAdjust(vector<int>&x, int s,int n){
for(int i = 2*s;i<=n;i*=2){
if(i<n && x[i-1]<x[i]){
i++;
}
if(x[s-1]>x[i-1]){
break;
}
swap(x[s-1],x[i-1]);
s=i;
}
}
void HeadSort(vector<int>& x){
int n = x.size();
for(int i = n/2;i>0;i--){
HeadAdjust(x,i,n);
}
for(int i = n;i>1;i--){
swap(x[0],x[i-1]);
HeadAdjust(x,1,i-1);
}
}
6. 归并排序
void Merge(vector<int>&arr,vector<int>&temp,int left,int mid,int right){
int l = left;
int r = mid+1;
int k = 0;
while(l<=mid && r<=right){
if(arr[l]<arr[r]){
temp[k++] = arr[l++];
}
else{
temp[k++] = arr[r++];
}
}
while(l<=mid){
temp[k++] = arr[l++];
}
while(r<=right){
temp[k++] = arr[r++];
}
k = 0;
while(left<=right){
arr[left++] = temp[k++];
}
}
void MSort(vector<int>&arr,vector<int>&temp,int left,int right){
if(left<right){
int mid = (left+right)/2;
MSort(arr,temp,left,mid);
MSort(arr,temp,mid+1,right);
Merge(arr,temp,left,mid,right);
}
}
void MergeSort(vector<int>& x){
vector<int> temp(x.size());
MSort(x,temp,0,x.size()-1);
}
7.快速排序
int Partition(vector<int> &x,int low,int high){
int temp = x[low];
while(low<high){
while(low<high && x[high]>=temp){
high--;
}
swap(x[low],x[high]);
while (low<high && x[low]<=temp){
low++;
}
swap(x[low],x[high]);
}
return low;
}
void QSort(vector<int>&x,int low,int high){
int pivot;
if(low<high){
pivot = Partition(x,low,high);
QSort(x,low,pivot);
QSort(x,pivot+1,high);
}
}
void QuickSort(vector<int>& x){
QSort(x,0,x.size()-1);
}
8.测试用例
int main() {
vector<int> vector_test;
vector_test.resize(100);
for(int i = 0;i<100;i++){
vector_test[i] = rand()%100;
}
QuickSort(vector_test);
vector<int>::iterator it = vector_test.begin();
for(;it!=vector_test.end();it++){
cout<<*it<<" ";
}
return 0;
}