重新回顾实现十大排序算法
什么是排序, 就是元素按照关键字进行递减或者递增的顺序排列
**排序的稳定性: **
1 排序算法的稳定性是根据相同数值的元素之间的相对位置进行判断。
**内排序 and 外排序: **
所谓的内排序就是排序时不涉及数据的内、外存交换, 则成为内排序 ,反之涉及的话就是外排序。
内排序适合元素个数不是很多的小表, 外排序适合多个表的数据进行排序。
内排序是外排序的基础。
排序算法的性能 : 排序算法的性能是根据时间 and 空间确定的
时间则是由元素比较和 移动的次数确定的
空间就是元素是否占用额外的存储空间
main函数 1 2 3 4 5 6 7 8 9 10 11 int main () { int nums[] = {12 ,21 ,11 ,0 ,8 ,53 }; int size = sizeof (nums)/ sizeof (int ); quickSort (nums,size); listNum (nums,size); return 0 ; }
快速排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 void quickSort (int nums[] , int size) { quick (nums, 0 , size - 1 ); } void quick (int *nums, int left , int right ) { if (left >= right){ return ; } int mid = partition (nums,left,right); quick (nums,left, mid); quick (nums, mid +1 ,right); } int partition (int nums[] , int left , int right) { int i = left; int j = right; while (i < j){ while (i < j && nums[j] >= nums[left]){ j--; } while (i < j && nums[left] >= nums[i]){ i++; } swap (nums,i,j); } swap (nums,i, left); return i; } void swap (int nums[], int left , int right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; }
选择排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void SelectSort (int nums[], int size) { for (int i = 0 ; i <size; i++){ int k = i; for (int j = i + 1 ; j < size; j++) { if (nums[k] > nums[j]){ k = j; } } swap (nums[i],nums[k]); } }
冒泡排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void mopoSort (int nums[] , int size) { for (int i = size -1 ;i > 0 ;i--){ for (int j = 0 ; j < i; j++) { if (nums[i] < nums[j]){ swap (nums[i], nums[j]); } } } }
插入排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 void insertSort (int nums[] , int size) { for (int i = 1 ; i < size; i++) { int base = nums[i]; int j = i - 1 ; cout<<"当前的数为: " <<base <<endl; while ( j >= 0 && nums[j] > base){ nums[j+1 ] = nums[j]; j--; } nums[j+1 ] = base; cout<<"排序后的顺序为: " ; listNum (nums,size); cout <<endl; } }
折半插入排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 void BinInsertSort (int nums[], int size) { for (int i = 1 ; i < size; ++i) { int base = nums[i]; int begin = 0 ; int end = i-1 ; while (begin <= end){ int mid = (begin + end) /2 ; if (nums[mid] >= base){ end = mid - 1 ; }else { begin = mid + 1 ; } } for (int j = i-1 ; j >= begin ; j--) { nums[j+1 ] = nums[j]; } nums[begin] = base; } }
归并排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 void mergeSort (int nums[], int size ) { divide (nums, 0 , size- 1 ); } void divide (int nums[] ,int left , int right) { if (left >= right ){ return ; } int mid = (left + right) /2 ; divide (nums, left, mid); divide (nums, mid + 1 , right); merge (nums, left, mid, right); } void merge (int nums[], int left, int mid, int right) { int size= right - left + 1 ; int temp[size] ; int i = left, j = mid + 1 ; int index = 0 ; while (i<= mid && j <= right ){ if (nums[i] < nums[j]){ temp[index++] = nums[i++]; } else { temp[index++] = nums[j++]; } } while ( i <= mid){ temp[index++] = nums[i++]; } while ( j <= right){ temp[index++] = nums[j++]; } for (int p = 0 ; p < index; p++) { nums[left + p] = temp[p]; } }
各排序的性能 参考: hello-算法
小结 - Hello 算法 (hello-algo.com)