快速排序
快速排序它的核心思想是,我们从数组的最右边选择一个数作为参考,然后把这个数放在数组中合适的位置,使得这个位置的左边的数都比这个数小,这个位置右边的数呢都比这个数大。这样这个数的位置我们就确定了,然后我们记录这个位置,不断的递归分治,使得小数组长度越来越小,最后就排好序了
核心思想
分治思想,相对思想
C语言实现
快速排序
#include<stdio.h>
void swap(int*arr,int left,int right) {
int term;
term = arr[left];
arr[left] = arr[right];
arr[right] = term;
}
void QuickSort(int* arr, int left, int right) {
if (left >= right) {
return;
}
int pos = partition(arr, left, right);
QuickSort(arr, left, pos - 1);
QuickSort(arr, pos + 1, right);
}
int partition(int*arr,int left,int right) {
int leftIndex = left;
int rightIndex = right-1;
//参考数字
int pivot = arr[right];
while (1) {
//找到索引,使得左边的数都比pivot小
while (leftIndex < right && arr[leftIndex] <= pivot) {
leftIndex++;
}
//找到索引,使得左边的数都比pivot大
while (rightIndex >= left && arr[rightIndex > pivot]) {
rightIndex--;
}
if (leftIndex > rightIndex) {
break;
}
/*如果程序走到这说明,上面的if语句没有执行,而且退出了上面两个while循环,证明leftIndex目前指向的数大于pivot,rightIndex指向的数小于pivot,这和我们的宗旨是相反的,我们想要leftIndex左面的数都比pivot小,rightIndex右面的数都比pivot大*/
//所以我们交换他们的位置
swap(arr, leftIndex, rightIndex);
//这样从新送回那两个while循环
}
//我们选取的pivot是数组最右边的数
//现在我们需要把right中的数值和leftindex中的数值互换即可(建议画图理解,这是难点,注意此时leftIndex>rightIndex)
swap(arr, leftIndex, right);
return leftIndex;
}
int main() {
int arr[4] = {4,3,2,1};
int* p = arr;
QuickSort(arr,0,3);
for (int i = 0; i < 4; i++) {
printf("%d ",arr[i]);
}
return 0;
}