题解 | #排序#
排序
https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
经典冒泡排序,时间:O(n*n),空间:O(1),稳定排序
int* MySort(int* arr, int arrLen, int* returnSize ) {
for (int i = 0;i<arrLen;i++){
for (int j = 0;j<arrLen-i-1;j++){
if (arr[j]>arr[j+1]) {
arr[j] += arr[j+1];
arr[j+1] = arr[j] - arr[j+1];
arr[j] = arr[j] - arr[j+1];
}
}
}
*returnSize = arrLen;
return arr;// write code here
}
递归实现快速排序,时间:O(n*log(n)),空间:O(log(n)),不稳定排序
void quicksort(int a[],int left,int right)//函数实现快速排序
{
if(left>=right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return;
}
int i=left;
int j=right;
int key=a[left];
while(i<j)
{
while(i<j && key<=a[j])/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想 升序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
j--;/*向前寻找*/
a[i]=a[j];/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是a[left],那么就是 给key)*/
while(i<j && key>=a[i])/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
i++;
a[j]=a[i];/*当在当组内找完一遍以后就把中间数key回归*/
}
a[i]=key;
quicksort(a,left,i-1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
quicksort(a,i+1,right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
}
原文链接:https://blog.csdn.net/sanguine_boy/article/details/104749377
