1. 程式人生 > >c++ 6種排序算法 源代碼

c++ 6種排序算法 源代碼

c++ 排序 源代碼

// 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; }

c++ 6種排序算法 源代碼