排序算法

本文详细介绍了四种常见的排序算法:选择排序、快速排序、冒泡排序和插入排序。包括每种排序算法的基本思想、操作步骤和示例代码,帮助读者理解和掌握这些基本排序方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有好多种排序方法

  • 选择排序
  • 快速排序
  • 冒泡排序
  • 插入排序
    等等

选择排序

基本思想:

假设排序表为L[1…n],第i趟排序从表中选择关键字最小的元素与Li交换,第一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。

代码:

- void SelectSort(ElemType arr[], int length)
{
     int i, j, min;
     ElemType tmp;

     for (i = 0; i < length - 1; ++i) // 需要n-1趟
     {
         min = i;

         for (j = i + 1; j < length; ++j)
         {
             if (arr[j] < arr[min]) // 每一趟选择元素值最小的下标
            {
                 min = j;
             }
         }

         if (min != i) // 如果第i趟的Li元素值该趟找到的最小元素值,则交换,以使Li值最小
         {
            tmp = arr[i];
             arr[i] = arr[min];
             arr[min] = tmp;
         }
     }
 }

快速排序

基本思想:

基于分治法,在待排序的n个元素中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和L[k+1 .. n],使得第一部分中的所有元素值都小于pivot,而第二部分中的所有元素值都大于pivot,则基准元素放在了其最终位置L(K)上,这个过程为一趟快速排序。而后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或为空为止,即所有元素都放在了其最终位置上。

代码:

- int Partition(ElemType arr[], int left, int right)
 {
     ElemType pivot = arr[left]; // 以当前表中第一个元素为枢轴值

     while (left < right)
     {
         // 从右向左找一个比枢轴值小的元素的位置
         while (left < right && arr[right] >= pivot)
         {
             --right;
         }

         arr[left] = arr[right]; // 将比枢轴值小的元素移动到左端

         // 从左向右查找比枢轴值大的元素的位置
         while (left < right && arr[left] <= pivot)
         {
             ++left;
         }

         arr[right] = arr[left];// 将比枢轴值大的元素移动到右端
     }

     arr[left] = pivot; // 将枢轴元素放在最终位置

     return left;
 }

- void QuickSort(ElemType arr[], int left, int right)
 {
     if (left < right)
     {
         int pivotPos = Partition(arr, left, right); // 划分
         QuickSort(arr, left, pivotPos - 1); // 快速排序左半部分
         QuickSort(arr, pivotPos + 1, right); // 快速排序右半部分
     }
 }

冒泡排序

基本思想:

假设待排序的表长为n, 从后向前或从前向后两两比较相邻元素的值,若为逆序,则交换之,直到序列比较完。这样一回就称为一趟冒泡。这样值较大的元素往下“沉”,而值较小的元素入上“浮”。

结果展示:

/*冒泡排序 分析详解:

 原始数据: 28, 30, 19, 2, 23

 第一趟:

       第一次:28, 30, 19, 2, 23

       第二次:28, 19, 30, 2, 23

       第三次:28, 19, 2, 30, 23

       第四次:28, 19, 2, 23, 30

 第二趟:

       第一次:19, 28, 2, 23, 30

       第二次:19, 2, 28, 23, 30

       第三次:19, 2, 23, 28, 30

 第三趟:

       第一次:2, 19, 23, 28, 30

       第二次:2, 19, 23, 28, 30

 第四趟:

       第一次:2, 19, 23, 28, 30

 */

代码:

void BubbleSort(ElemType arr[], int length)
{
    int i, j;
    ElemType tmp;

    for (i = 0; i < length - 1; ++i)// 趟次
    {
        for (j = i + 1; j < length; ++j)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

插入排序

基本思想:

将等排序列划分为有序与无序两部分,然后再依次将无序部分插入到已经有序的部分,最后就可以形成有序序列。

操作步骤:

1)查找出元素L(i)在表中的插入位置K;
2)将表中的第K个元素之前的元素依次后移一个位置;
3)将L(i)复制到L(K)。

代码:

-(void)insertSortWithArray:(NSArray *)aData{
 NSMutableArray *data = [[NSMutableArray alloc]initWithArray:aData];
 for (int i = 1; i < [data count]; i++) {
 id tmp = [data objectAtIndex:i];
 int j = i-1;
 while (j != -1 && [data objectAtIndex:j] > tmp) {
 [data replaceObjectAtIndex:j+1 withObject:[data objectAtIndex:j]];
 j--;
 }
 [data replaceObjectAtIndex:j+1 withObject:tmp];
 }
 NSLog(@"插入排序后的结果:%@",[data description]);
 [data release];
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值