您好,登錄后才能下訂單哦!
// sort.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
void print(T* &arr,int len) {
for (int i=0;i<len;i++)
{
cout<<*(arr+i)<<' ';
}
cout<<endl;
}
//簡單選擇排序
/*
1.i=[0,len-1),j=[i+1,len-1]數組第i元素值與j元素值比較,大于交換i與j的元素值
2.j+=1 重復第一步直到 j == len
3.i+=1 重復第一步 直到 i == len - 1
*/
template <typename T>
void select_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<<endl;
return;
}
for (int i=0; i<len-1; i++)
for (int j=i+1;j<len;j++)
if (array[i] > array[j])
swap(array[i],array[j]);
}
//冒泡排序
/*
1.BUBBLE相鄰2個元素比較,大則交換
每一次使得最大的值到最上面
*/
template <typename T>
void bubble_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<<endl;
return;
}
bool flag;
for (int i=0; i<len-1; i++)
{
flag = true;
for (int j=0;j<len-i-1;j++)
if (array[j] > array[j+1])
{
flag = false;
swap(array[j],array[j+1]);
}
if (flag) break;
}
}
//插入排序
/*
1.i屬于[1,len)從i位置往前判斷j屬于[0,i)
則后一個元素與前一個相比小于則替換,大于等于退出第一個循環
*/
template <typename T>
void insert_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<<endl;
return;
}
for (int i=1; i<len; i++)
{
for (int j=i;j;j--)
{
if (array[j] >= array[j-1])
break;
swap(array[j],array[j-1]);
}
}
}
//歸并排序
/*
用到二分思想將數據遞歸成左右2邊得到鏈表A,B
1.鏈表A,B用鏈表歸并來得到新的有序鏈表
*/
template <typename T>
void merge(T* &array,int left,int mid,int right,T* temp){
int i = left;
int j = mid+1;
int k = 0;
while (i<=mid && j<=right)
{
if (array[i] > array[j])
temp[k++] = array[j++];
else
temp[k++] = array[i++];
}
//追加最后
while (i <= mid)
temp[k++] = array[i++];
while (j<=right)
temp[k++] = array[j++];
//臨時變量copy到元素組中
k = 0;
while(left<=right)//沒注意寫成k<=right 調試了半天。 數據變成大數考慮是否賦值越界
array[left++] = temp[k++];
}
template <typename T>
void merger_sort(T* &array,int left,int right,T* temp){
if (left < right)
{
int mid = (left + right)/2;
merger_sort<T>(array,left,mid,temp);//排序左邊子序列
merger_sort<T>(array,mid+1,right,temp);//排序右邊子序列
merge<T>(array,left,mid,right,temp);//左右2邊歸并
}
}
template <typename T>
void merger_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<<endl;
return;
}
T* temp = new T[len];
merger_sort<T>(array,0,len-1,temp);
if (NULL != temp)
{
delete[] temp;
temp = NULL;
}
}
//快排
/*
(一)挖坑填坑
1.以第一個元素為基準X 初始值前綴i = left 后綴j = right
2.后綴從后往前查找j元素值 < X;i處 賦值 j元素值
3.前綴從前往后查找i元素值 > X;j處 賦值 i元素值
重復第2,3步
(二)分治
1.左邊[left,i)執行(一)
2.右邊(i,right]執行(一)
遞歸執行1,2
*/
template <typename T>
int dig_fil(T* &array,int left,int right){
T X = array[left];
int i = left;
int j = right;
while (i<j)
{
while(j>i && array[j] >= X)j--;
if (j>i)//只有滿足后綴大于前綴才能賦值 不然會數組越界
{
array[i] = array[j];
i++;
}
while(i<j && array[i] < X) i++;
if (i<j)
{
array[j] = array[i];
j--;
}
}
array[i] = X;
return i;
}
template <typename T>
void quick_sort(T* &array,int left,int right){
if (left < right)
{
int mid = dig_fil<T>(array,left,right);
quick_sort(array,left,mid-1);
quick_sort(array,mid+1,right);
}
}
template <typename T>
void quick_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<<endl;
return;
}
quick_sort(array,0,len-1);
}
//堆排序
/*
堆排序采用完全二叉樹
1.從所有非葉節點中構建最大堆
2.交換堆頂與最后一個元素
3.對所有[0,len-1)執行第 1,2步
*/
template <typename T>
void adjust(T* &array,int sign,int len){
T temp = array[sign];
//每一次循環都更新該父節點為根的完全二叉樹最大堆
for (int i = sign * 2 + 1; i < len; i = i * 2 + 1){
if (i + 1 < len && array[i + 1] > array[i])
i++;
//判斷子節點 大于父節點
if (array[i] > temp){
array[sign] = array[i];
sign = i;
}
}
array[sign] = temp;
}
template<typename T>
void heap_sort(T* &array,int len){
//1.從所有非葉子節點 構建初始大頂堆
for (int i = len / 2 - 1; i >= 0; i--){
adjust(array, i, len);
}
//
for (int i = len - 1; i; i--){
//2.交換最大堆 和 相對的最后一個元素
swap(array[i],array[0]);
//3.重新調整堆結構
adjust(array, 0, i);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,5,4,9,0,2,3,6,8,7};
int* pa = a;
//select_sort<int>(pa,10);
//bubble_sort<int>(pa,10);
//insert_sort<int>(pa,10);
//merger_sort<int>(pa,10);
//quick_sort<int>(pa,10);
//heap_sort(pa,10);
print<int>(pa,10);
getchar();
return 0;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。