1. 程式人生 > 實用技巧 >幾種排序演算法

幾種排序演算法

  1 /*
  2     線性表的排序演算法
  3     cza
  4     2020/7/1
  5 */
  6 #include<iostream>
  7 #include<stdio.h>
  8 int num[100];
  9 using namespace std;
 10 
 11 int getMix(int left,int right){//找到left到right這一段資料中的最小值
 12     int mixn=left;
 13     for(int i=left;i<right;i++){
 14         if(num[i]<num[mixn]){
15 mixn=i; 16 } 17 } 18 return mixn; 19 } 20 21 void select_sort(int left,int right){//選擇排序 22 int flag=getMix(left,right); 23 int temp=num[flag]; 24 num[flag]=num[left]; 25 num[left]=temp; 26 left+=1; 27 if(left==right) 28 return
; 29 else 30 select_sort(left,right);//不是迴圈,從遞迴調用出來就return 31 //return; 32 } 33 34 void bubble_sort(int left,int right){ 35 int temp; 36 for(int i=left;i<right-1;i++){//這裡應該是right-1,如果是right的話i+1會發生“越界” 37 if(num[i]>num[i+1]) 38 { 39 temp=num[i];
40 num[i]=num[i+1]; 41 num[i+1]=temp; 42 } 43 } 44 right-=1; 45 if(left==right) 46 return; 47 else 48 bubble_sort(left,right); 49 } 50 51 void insert_sort(int left,int ordered,int right){//插入排序, 52 int in_place; 53 for(in_place=left;num[in_place]<num[ordered+1];in_place++); 54 int temp=num[ordered+1]; 55 for(int i=ordered+1;i>in_place;i--){ 56 num[i]=num[i-1]; 57 } 58 num[in_place]=temp; 59 ordered+=1; 60 if(ordered==right-1)//左閉右開時是right-1,閉區間時是right 61 return; 62 else 63 insert_sort(left,ordered,right); 64 } 65 void shell_sort(int left,int right){ 66 int i,j,k,temp,gap; 67 int len=right-left;//左閉右開不用加一 68 for(gap=len/2;gap>0;gap/=2){//初始步長為陣列長度的一半,每次遍歷後步長減小為原來的一半 69 for(i=left;i<gap;i++){//變數i為每次分組的第一個元素的下標 70 for(j=i+gap;j<len;j+=gap){ 71 temp=num[j]; 72 k=j-gap; 73 while(k>=left&&num[k]>temp){//向前找,直接插入排序 74 num[k+gap]=num[k]; 75 k-=gap; 76 } 77 num[k+gap]=temp; 78 } 79 80 } 81 } 82 } 83 int getMin(int a,int b){ 84 if(a<=b) return a; 85 else return b; 86 } 87 void merge_sort(int left,int right){//歸併排序 88 if((right-left)>2){ 89 merge_sort(left,(left+right)/2); 90 merge_sort((left+right)/2,right); 91 } 92 int right_pointer=(left+right)/2; 93 int left_pointer=left; 94 int temp[100]; 95 int i=left; 96 while(left_pointer<(left+right)/2&&right_pointer<right){ 97 int m=getMin(num[left_pointer],num[right_pointer]); 98 temp[i]=m; 99 if(num[right_pointer]==m) right_pointer+=1; 100 else left_pointer+=1; 101 i+=1; 102 } 103 if(!(right_pointer<right)){ 104 while(i<=right){ 105 temp[i]=num[left_pointer]; 106 i+=1; 107 left_pointer+=1; 108 } 109 }else{ 110 while(i<=right){ 111 temp[i]=num[right_pointer]; 112 i+=1; 113 right_pointer+=1; 114 } 115 } 116 for(int j=left;j<right;j++){ 117 num[j]=temp[j]; 118 } 119 } 120 121 void quick_sort(int left,int right){//快速排序 122 if(right-left<=1) return; 123 int pointer=left; 124 for(int i=left+1;i<right;i++){ 125 if(num[i]<num[pointer]){ 126 int temp=num[i]; 127 for(int j=i;j>pointer;j--){ 128 num[j]=num[j-1]; 129 } 130 num[pointer]=temp; 131 pointer+=1; 132 } 133 } 134 quick_sort(left,pointer+1); 135 quick_sort(pointer+1,right); 136 } 137 int main() 138 { 139 int n; 140 cin>>n; 141 for(int i=0;i<n;i++){ 142 cin>>num[i]; 143 } 144 //select_sort(0,n); 145 //bubble_sort(0,n); 146 //insert_sort(0,0,n); 147 //shell_sort(0,n); 148 //merge_sort(0,n); 149 quick_sort(0,n); 150 for(int i=0;i<n;i++){ 151 cout<<num[i]<<" "; 152 } 153 }