c语言三维坐标排序,c语言5个常用的排序算法实例代码

1.插入排序

基本思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

void insertSort(vector& nums)

{

int k = 0;

for (int i = 0; i < nums.size(); ++i)

{

int temp = nums[i];

int j = i;

for (; j > 0 && temp < nums[j-1]; --j)

nums[j] = nums[j-1];

nums[j] = temp;

}

}

2.希尔排序

基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

void shellSort(vector& nums)

{

for (int gap = nums.size() / 2; gap > 0; gap /= 2)

{

for (int i = gap; i < nums.size(); ++i)

{

int temp = nums[i];

int j = i;

for (; j >=gap && temp < nums[j-gap]; j -= gap)

nums[j] = nums[j - gap];

nums[j] = temp;

}

}

}

3.堆排序

用一句概括,堆排序就是一种改进的选择排序,改进的地方在于,每次做选择的时候,不单单把最大的数字选择出来,而且把排序过程中的一些操作进行了记录,这样在后续排序中可以利用,并且有分组的思想在里面,从而提高了排序效率,其效率为O(n*logn).

#include

int c=0;

/*heapadjust()函数的功能是实现从a[m]到a[n]的数据进行调整,使其满足大顶堆的特性*/

/*a[]是待处理的数组,m是起始坐标, n是终止坐标*/

void heapadjust(int a[], int m, int n)

{

int i, temp;

temp=a[m];

for (i=2*m;i<=n;i*=2)//从m的左孩子开始

{

if(i+1<=n && a[i]

{

i++;

}

if(a[i]

{

break;

}

a[m]=a[i];

m=i;

}

a[m]=temp;

}

void crtheap(int a[], int n)//初始化创建一个大顶堆

{

int i;

for (i=n/2; i>0; i--)//n/2为最后一个双亲节点,依次向前建立大顶堆

{

heapadjust(a, i, n);

}

}

/*swap()函数的作用是将a[i]和a[j]互换*/

void swap(int a[], int i, int j)

{

int temp;

temp=a[i];

a[i]=a[j];

a[j]=temp;

c++;

}

void heapsort(int a[], int n)

{

int i;

crtheap(a, n);

for (i=n; i>1; i--)

{

swap(a, 1, i);

//将第一个数,也就是从a[1]到a[i]中的最大的数,放到a[i]的位置

heapadjust(a, 1, i-1);

//对剩下的a[1]到a[i],再次进行堆排序,选出最大的值,放到a[1]的位置

}

}

int main(void)

{

int i;

int a[10]={-1,5,2,6,0,3,9,1,7,4};

printf("排序前:");

for (i=1;i<10;i++)

{

printf("%d",a[i]);

}

heapsort(a, 9);

printf("\n\n共交换数据%d次\n\n", c);

printf("排序后:");

for (i=1;i<10;i++)

{

printf("%d",a[i]);

}

printf("\n\n\n");

return 0;

}

4.归并排序

基本思想:归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为:

1)划分子表

2)合并半子表

刚好最近刷leetcode有道题用的归并排序:sort list

class Solution {

public:

//归并排序

ListNode* getMiddleOfList(ListNode* head)

{

ListNode* mid = head;

ListNode* last = head;

while (last->next!=NULL&&last->next->next!=NULL)

{

mid = mid->next;

last = last->next->next;

}

return mid;

}

ListNode* sortList(ListNode* head) {

if (head == NULL || head->next == NULL)return head;

ListNode* mid = getMiddleOfList(head);

ListNode* midnext = mid->next;

mid->next = NULL;

return mergeList(sortList(head), sortList(midnext));

}

ListNode* mergeList(ListNode* a, ListNode* b)

{

ListNode* res = new ListNode(-1);

ListNode* cur = res;

while (a != NULL&&b != NULL)

{

if (a->val < b->val)

{

cur->next = a;

a = a->next;

}

else

{

cur->next = b;

b = b->next;

}

cur = cur->next;

}

cur->next = a != NULL ? a : b;

return res->next;

}

};

5.快速排序

基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

class sort {

public:

int median3(vector& nums, int left, int right)

{

int mid = (left + right) / 2;

if (nums[left] > nums[mid])swap(nums[left], nums[mid]);

if (nums[mid] > nums[right])swap(nums[mid], nums[right]);

if (nums[left] > nums[mid])swap(nums[left], nums[mid]);

swap(nums[mid], nums[left]);

return nums[left];

}

void quickSort(vector& nums, int i, int j)

{

if (i > j)return;

int partition = median3(nums, i, j);

int low = i+1, high = j;

while (low < high)

{

while (nums[low] < partition)low++;

while (nums[high] > partition)high--;

if (low < high)swap(nums[low], nums[high]);

else

break;

}

swap(nums[i], nums[high]);

quickSort(nums, i, high - 1);

quickSort(nums, high + 1, j);

}

void qs(vector& nums)

{

quickSort(nums, 0, nums.size() - 1);

}

};

总结

以上就是本文关于c语言5个常用的排序算法实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值