關於常用的排序演算法有:
插入排序:直接插入排序、希爾排序
選擇排序:直接選擇排序、堆排序
交換排序:氣泡排序、快速排序(4種逐漸優化)
歸併排序:歸併排序
一下分別給出以上方法具體**,並且堆快速排序做出幾種優化:
(1)子區間優化方法,即可以在最後幾層也就是區間不大情況下,直接選擇插入排序消耗更少
(2)取key關鍵字用三數取中的方法,保證它既不是最大也不是最小,提高效率
(3)單趟排序採用挖坑方法
(4)單趟排序採用前後指標的方法
#pragma once
#include #include #include #include using namespace std;
//1.插入排序(直接插入排序)
void insertsort(int* a, size_t n)
a[end + 1] = tmp;//插入合適位置 }}
//時間複雜度:0(n*n)
//2.插入排序(希爾排序)
void shellsort(int *a, size_t n)
a[end + gap] = tmp;
} }}//時間複雜度(o(n^1.3))
//3.選擇排序,每次選乙個最大的最小的放在對應位置,再一次類推
void selectsort(int* a, size_t n)
if (a[i] > a[max])
}swap(a[max], a[end]);
//防止min與end重合了,這是後,end位置元素被max改, 則還原min的位置
if (min == end)
swap(a[min], a[begin]);
//縮小區間以此類推
++begin;
--end; }}
//4.堆排序
void adjustdown(int* a, size_t n, int parent)
if (a[child] > a[parent])
else
}}void heapsort(int* a, size_t n)
//排序
int end = n - 1;
while (end > 0) }
//5.選擇排序(氣泡排序)
void bubblesort(int* a, size_t n)
} if (exchange == false)
}}//6.快速排序
//優化方法一:key的選取為三數取中
int getmidindex(int* a, int begin, int end)
else if (a[begin] > a[end])
else
}else//
else if (a[begin] > a[end])
else
}}//優化方法三,單趟排序方法改為挖坑法
int partsort1(int* a, size_t begin, size_t end)
a[end] = a[begin];//填第乙個坑,a[begin]為下乙個坑
while (begin < end && a[end] >= key)
a[begin] = a[end];
//來到這裡說明相遇,以及劃分好
} a[begin] = key;
return begin;
}//優化方法4,單趟排序為前後指標法
void partsort3(int* a, size_t begin, size_t end)
while (begin < end && key <= a[end])
//找到大的,小的
swap(a[begin], a[end]);
} //begin地方比key大,因為它先停下來
//單一解決有序的問題,還有待考慮。
//if(key= right)//區間為1,已經有序,停止
//優化方法2,子區間優化,最後基層不用快速排序,二用插入排序
//if (right - left < 16)
// int mid = partsort1(a, left, right);
quiksort(a, left, mid - 1);
quiksort(a, mid+1, right);
}//非遞迴實現快速排序
void quiksortnonr(int* a, int left, int right)
if (mid + 1 < end)
}}//歸併排序
void mergesort(int* a, size_t n)
//使得左右2邊有序,並且歸併
void _mergesort(int* a, int left, int right, int* tmp)
int mid = left + ((right - left) >> 1);
_mergesort(a, left, mid, tmp);
_mergesort(a, mid+1, right, tmp);
int begin1 = left;
int end1 = mid;
int begin2 = mid+1;
int end2 = right;
size_t index = left;
//歸併
while (begin1 <= end1 && begin2 <= end2)
else
}//出來之後,對剩下的歸併
while (begin1 <= end1)
while (begin2 <= end2)
//拷貝
memcpy(a+left, tmp+left, (right-left+1)*sizeof(int));
}void test()
; int a = ;
size_t n = sizeof(a)/sizeof(a[0]);
insertsort(a, n);
shellsort(a, n);
selectsort(a, n);
heapsort(a,n);
bubblesort(a, n);
quiksort(a, 0, n-1);
quiksortnonr(a, 0, n - 1);
for (size_t i = 0; i < n; i++)
cout << endl;
}
常用的排序演算法
排序方式 插入排序 直接插入排序 shell排序 選擇排序 直接選擇排序 堆排序交換排序 氣泡排序 快速排序 歸併排序 分配和索引排序 基數排序 桶式排序 include using namespace std 直接插入排序 arr為待排陣列,n為陣列長度 void insertsort int a...
常用的排序演算法
1.氣泡排序 private static void bubblesort int a 列印氣泡排序的結果 for int i 0 i2.快速排序 public class quicksort qs.data data qs.sort 0,qs.data.length 1 qs.display 3....
常用的排序演算法
1.氣泡排序 時間複雜度 o n 2 氣泡排序演算法的運作如下 從後往前 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上...