快速排序
方法:从左边开始找比基准值大的元素,从右边找比基准值小的元素,交换两个元素
缺点:如果所给元素序列为逆序的,那么快速排序的时间复杂度很糟糕。
长序列对递归排序来说不友好。
时间复杂度:平均O(NlogN),最坏O(N)
空间复杂度:最坏O(N);
稳定性:不稳定排序
int _QuicSort(int arr[], int beg, int end){ if ((end-beg) <= 1){ return beg; } int left = beg; int right = end; int key = arr[right];//基准值 while (left < right){ while (left < right&&arr[left] <= key){ ++left; } while (left < right&&arr[right] >= key){ --right; } if (left < right){ swap(&arr[left], &arr[right]); } } //最后把基准值和left指向的位置交换 swap(&arr[left], &arr[end]); return left; } void QuicSort(int arr[], int beg,int end){ if ((end - beg) <= 1){ return ; } int mid = _QuicSort(arr, beg,end); QuicSort(arr, beg, mid-1); QuicSort(arr, mid + 1, end); }
2.挖坑法
和上面的代码基本一样,不同点_QuicSort函数实现上
int _QuicSort(int arr[], int beg, int end){ if ((end - beg) <= 1){ return beg; } int left = beg; int right = end; int key = arr[end]; while (left < right){ while (left < right&&arr[left] <= key){ left++; } if (left < right){ arr[right]=arr[left]; } while (left < right&&arr[right] >= key){ right--; } if (left < right){ arr[left] = arr[right]; } } arr[left] = key; return left; }