数组排序
void qsort(int *a,int l,int r) {
if (l < r) {
int q = partition(a,l,r); //返回的q为一次partition后返回的元素的下标
qsort(a, l, q - 1); //分别对前后排序
qsort(a, q + 1, r);
}
}
int partition(int *a, int l, int r) { //传入的分别为数组、下标头、下标尾
int x = a[r]; //每次排的是数组的最后一个元素
int index = l - 1; //index从-1开始
for (int i = l; i < r; i++) {
if (a[i] < x) {
index++;
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
a[r] = a[++index]; //for循环结束后交换key与当前下标的元素
a[index] = x;
return index; //返回本次partition排的那个元素的最终下标
}
//调用方式
qsort(nums,0,9);
链表排序
ListNode* sortList(ListNode* head) {
quicksort(head,nullptr); //传入的时候一定要是head和空!
return head;
}
void quicksort(ListNode* begin, ListNode* end) {
if (begin != end) {
ListNode* p = partition(begin, end);
quicksort(begin, p);
quicksort(p->next, end);
}
}
ListNode* partition(ListNode* begin, ListNode* end) { //每次的key是当前链表区间的第一个元素
ListNode* index = begin;
ListNode* i = index;
while (i!=end) {
if (i->val < begin->val) {
index = index->next;
swap(i->val, index->val); //交换i和index指向的值
}
i = i->next;
}
swap(index->val, begin->val); //交换这个链表区间头的值和当前index处的值
return index;
}